• win32-编码

    0x1原始的ascii编码

    在计算机中,计算机只能识别由0或1构成的东西,其它的字符一律不认识,西方人为了将计算机与生活联系起来,使用了ascii的编码,就是将一些生活中常用的符合字母用0、1来表示,16进制范围是0-7F,更多的是比如大写手的A这个字母,在计算机中表示就是1000001

    字符 二进制 十进制 16进制
    A 1000001 65 41
    B 1000010 66 42
    C 1000011 67 43

    有关asscii的文本进制转换可以在在线工具 https://kuangtant.gitee.io/tools/asscii/ 转换

    image-20220115182108121

    但是,原始的asscii编码有一个很大的缺点,就是只有西文的字母符号,一般说它是标准的asscii编码,没有其它国家的任何语言字符,比如中文,后面就有了asscii的拓展

    0x2 asscii的拓展

    标准的asscii的编码的范围是0-127,拓展的范围就是128-255,这个拓展是将西文中一些不常用的符号表示出来

    对于中文,就采用两张asscii的拓展表,联合在一起,表示一个中文汉字,也就是说,一个中文汉字的表示要占用16位,也就是2个字节,标准的表示就是GBK编码或GB2312编码

    字符 16进制
    D6D0
    B9FA
    BAC3

    标准的asscii/gb2312编码在线查询及转换:https://kuangtant.gitee.io/tools/gb2312/

    image-20220115184258311

    0x3 Unicode编码

    前面两种编码都存在一些问题,就是在不同的国家,编码显示的文字可能不一样,因为编码的读取方式不同

    后面出现了一张包含世界所有文字的一个编码表,只要这个世界上存在的文字符号,统统给与一个唯一的编码,Unicode编码

    Unicode编码的范围是0-0x10FFFF,就是说,它可以容纳100多万个符号。

    但是,它也有一个问题,它只规定了符号的二进制代码,没有规定这个二进制代码该怎样储存

    0x4 Unicode:UTF-16/UTF-8

    • UTF-16编码以16位无符号整数为单位,即是16位为一个单位,不表示一个字符只有16位。这个要看字符的unicode编码处于什么范围而定,有可能是2个字节,也有可能是4个字节,现在计算机上的unicode编码一般指的是UTF-16

    • UTF-8:

      Unicode编码(16进制) UTF-8字节流(二进制)
      000000-00007F 0xxxxxxx
      000080-0007FF 110xxxxx 10xxxxxx
      000800-00FFFF 1110xxxx 10xxxxxx 10xxxxxx
      010000-10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

    win32-c语言中的宽字符

    0x01 字符和字符串在内存中的值

    1
    2
    chr str0[] = "中国"
    wchar_t wstr[] = L"中国"

    在没有特殊说明的情况下,str0是asscii的默认编码,中国在内存中会是D6 D0 B9 FA 00,5个字节。

    但是,wstr是Unicode的编码的中国,2D 4E FD 56 00 00为其编码,占用6个字节,又叫宽字符。

    0x02 常用函数

    一般asscii unicode 描述
    char wchar_t 多字节字符类型,宽字符类型
    printf wprintf 打印控制台函数
    strlen wcslen 获取长度
    strcpy wcscpy 字符串复制
    strcat wcscat 字符串拼接
    strcmp wcscmp 字符串比较
    strstr wcsstr 字符串查找

    0x03 简单用法

    打印宽字符,就代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    #include "stdafx.h"
    #include <locale.h>
    int main(){
    setlocale(LC_ALL,"");//使用控制台默认编码
    wchar_t wstr[]=L"中国";
    wprintf(L"%s\n",wstr);
    return 0;
    }

    获取长度

    1
    2
    3
    4
    5
    6
    7
    8
    #include "stdafx.h"
    #include <locale.h>
    int main(){
    setlocale(LC_ALL,"");//使用控制台默认编码
    wchar_t wstr[]=L"中国";
    int len=wcslen(wstr); //不包括00 00
    return 0;
    }

    win32-什么是win32 api

    主要是存放在c:\WINDOWS\system32下的所有dll

    几个比较重要的dll

    • Kernel32.dll:最核心的功能模块,比如内存管理、进程和线程相关函数等。
    • User32.dll:是windows用户界面相关应用程序的接口,如创建窗口和发送信息等。
    • GDI32.dll:全称是图形设备接口

    要使用win32 api,在cpp文件的开头需要引用windows.h,就可以尽情使用其api了

    常用数据类型

    汇编:

    byte BYTE PBYTE
    word WORD PWORD
    dword DWORD PDWORD

    C语言:

    char CHAR PCHAR
    unsigned char UCHAR PUCHAR
    short SHORT PSHORT
    unsigned short USHORT PUSHORT
    int INT PINT
    unsigned int UINT PUINT

    在win32中,虽然一些数据类型不常见,其实这些数据类型就是将c语言中的一些数据类型封装了一下

    在win32中使用字符串

    字符类型:

    • CHAR 声明asscii编码的字符串
    • WCHAR 声明unicode编码的字符串
    • TCHAR根据当前开发环境,自动转换为符合当前环境的上面编码方式之一
    1
    2
    3
    CHAR szstr[] = "good1";	//asscii
    WCHAR swstr[] = L"good2"; //unicode
    TCHAR str[] = TEXT("goods3"); //根据系统自动转换

    字符串指针:

    与上面的字符类型相一致,有以下的指针类型

    • PSTR是asscii编码字符串对应的指针
    • PWSTR是unicode编码字符串对应的指针
    • PTSTR根据TCHAR对应的指针
    1
    2
    3
    PSTR szstr = "good1";//asscii
    PWSTR swstr = L"good2";//unicode
    PTSTR str = TEXT("goods3");//根据系统自动转换

    第一个窗口

    由于win32采用的是api编程,所以窗口也有一个自己的api函数接口,这个接口是MessageBox()函数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <windows.h>

    int main() {
    CHAR szstr[] = "good1";//asscii
    WCHAR swstr[] = L"good2";//unicode
    TCHAR str[] = TEXT("goods3");//根据系统自动转换

    WCHAR title[] = L"标题";
    WCHAR content[] = L"dd";
    MessageBox(0,content,str,MB_OK);
    return 0;
    }

    以上代码演示了第一个win32窗口,由于测试时默认采用的是unicode编码,所以在MessageBox传入参数时,如果title或content采用CHAR类型的字符串类型时,可能会报错”不能将char*的类型分配到LPCWSTR类型的实体”,解决方案:

    • 在工程处右键,属性-常规-字符集,将Unicode字符集改为为多字节字符集,应用并确认即可。

    • 在常量报错时使用”_T”宏(若出现未定义标识符,则需增加头文件#include <tchar.h>)格式:_T( ),或者使用关键字“L”,格式:L””,或者使用TEXT,格式TEXT( )

    image-20220402220319921

    image-20220402220353298

    上一篇:
    Win32笔记-进阶
    下一篇:
    RC4的加密与解密实现
    本文目录
    本文目录