PoEdu-Windows班-002 常用字符类型及转换

来源:互联网 发布:网络管理 委托代理 编辑:程序博客网 时间:2024/06/01 18:43
Windows数据类型
  • 微软将C语言的数据类型进行了单纯的包装, 形成了大量的自己的类型.
  • 这些类型只基于Windows SDK中.
  • 它是没有原生bool类型的.


Windows数据类型简介
  • 按照规范, 所有的Windows类型都应在 WinDef.h 中找到。
  • 可是, 微软经过这么多年的发展, 数据类型定义已经略乱, 只能借助Visual Studio的转到定义功能进行查看
  • 这些类型是 Windows进行定义的, 也就是说, 它们不是C标准通用的。
  • 很多数据类型都是一样的, 只不过换了一种写法, 为了使语义更加通顺。


下面列举一些比较常见的数据类型, 看到了就得认识.


BYTE
  • typedef unsigned char BYTE;


WORD
  • typedef unsigned short WORD;


DWORD
  • typedef unsigned long DWORD;


QWORD
  • typedef unsigned __int64 QWORD;
  • PS:VS2015以上才有的数据类型


DWORD_PTR
#if ( defined(__midl) && (501 < __midl) )
    typedef [public] __int3264 INT_PTR, *PINT_PTR;
    typedef [public] unsigned __int3264 UINT_PTR, *PUINT_PTR;
    typedef [public] __int3264 LONG_PTR, *PLONG_PTR;
    typedef [public] unsigned __int3264 ULONG_PTR, *PULONG_PTR;
#else  // midl64
// old midl and C++ compiler
#if defined(_WIN64)
    typedef __int64 INT_PTR, *PINT_PTR;
    typedef unsigned __int64 UINT_PTR, *PUINT_PTR; 
    typedef __int64 LONG_PTR, *PLONG_PTR;
    typedef unsigned __int64 ULONG_PTR, *PULONG_PTR; 
    #define __int3264   __int64
#else
    typedef _W64 int INT_PTR, *PINT_PTR;
    typedef _W64 unsigned int UINT_PTR, *PUINT_PTR; 
    typedef _W64 long LONG_PTR, *PLONG_PTR;
    typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;
    #define __int3264   __int32
#endif
#endif // midl64
  • typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR
它本意是一个 32bit的地址值, 用来存放 32bit地址值的类型
但是在 64位操作系统中, 它也能存放 64位的地址值
这就是向上兼容


DWORD32
  • typedef unsigned int DWORD32, *PDWORD32;


DWORD64
  • typedef unsigned __int64 DWORD64, *PDWORD64;


DWORDLONG
  • typedef unsigned __int64 ULONGLONG;
  • typedef ULONGLONG DWORDLONG;


LPWSTR
  • typedef wchar_t WCHAR;
  • typedef Null_terminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;
  • LONG POINTER WIDE STRING


LPSTR
  • typedef char CHAR;
  • typedef Null_terminated CHAR *NPSTR, *LPSTR, *PSTR;
  • LONG POINTER (ANSI) STRING


LPCWSTR
  • typedef Null_terminated CONST WCHAR *LPCWSTR, *PCWSTR;
  • LONG POINTER CONST WIDE STRING


LPCSTR
  • typedef Null_terminated CONST CHAR *LPCSTR, *PCSTR;
  • LONG POINTER CONST (ANSI) STRING


error_status_t
  • 本质是 unsigned long
  • 通过GetLastError获取


FLOAT
  • typedef float FLOAT


HANDLE
  • typedef void* HANDLE


TCHAR
  • 工程为 UNICODE(宽字节), TCHAR 则是 wchar_t
  • 工程为 ANSI(多字节), TCHAR 则是 char


HCALL
  • typedef DWORD HCALL


HRESULT
  • typedef LONG HRESULT


INT
  • typedef int INT;


INT8
  • typedef char INT8


INT16
  • typedef short INT16


INT32
  • typedef int INT32


INT64
  • typedef __int64 INT64


LMCSTR
  • typedef const wchar_t* LMCSTR;
  • VS2015以上版本才有


LMSTR
  • typedef WCHAR* LMSTR;
  • VS2015以上版本才有


LONG
  • typedef long LONG;


LONGLONG
  • typedef __int64 LONGLONG;


LONG_PTR
  • typedef __int3264 LONG_PTR;


LONG32
  • typedef int LONG32;


LONG64
  • typedef __int64 LONG64;


LPVOID
  • typedef const void* LPVOID;


SHORT
  • typedef short SHORT;


SIZE_T
  • typedef ULONG_PTR SIZE_T;
  • 不同于 C++中的size_t类型, 需要注意


UCHAR
  • typedef unsigned char UCHAR;


STRING
  • typedef UCHAR* STRING;


UINT
  • typedef unsigned int UINT;


UINT8
  • typedef unsigned char UINT8;


UINT16
  • typedef unsigned short UINT16;


UINT32
  • typedef unsigned int UINT32;


UINT64
  • typedef unsigned __int64 UINT64;


ULONG
  • typedef unsigned long ULONG;


ULONG_PTR
  • typedef unsigned __int3264 ULONG_PTR;


ULONG32
  • typedef unsigned int ULONG32;


ULONG64
  • typedef unsigned __int64 ULONG64;


ULONGLONG
  • typedef unsigned __int64 ULONGLONG;


USHORT
  • typedef unsigned short USHORT;


VOID
  • typedef void VOID;






字符编码


UTF-8

  • 最小单位就是8bit 可变长, 最少8bit, 多了可以在占用


UTF-16
  • Windows用的就是UTF-16(从VISTA开始) --> 也就是Unicode
  • 最小单位就是16bit 可变长, 最少16bit, 多了可以在占用


UTF-32
  • 最小单位就是32bit 可变长, 最少32bit, 多了可以在占用

他们之间都可以进行相互转换



宽字节和窄字节的转换:

  • 可以使用A2W和W2A,但要注意,返回的指针是new的,需要手动delete。
  • 使用这2个宏之前,需要使用USES_CONVERSION这个宏。每一次使用都需要加上这个。



求长度:
  • Strlen()函数求的是字符串占用的字节数,不包括结束符。一个汉字返回2.
  • Wcslen()求出来的是有多少个“字符”,这里的“字符”指的是一个字、字母、符号等等。即一个汉字也是返回1.



GB2312到UTF-8的相互转换


//UTF-8到GB2312的转换char* U2G(const char* utf8){int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);wchar_t* wstr = new wchar_t[len+1];memset(wstr, 0, len+1);MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);char* str = new char[len+1];memset(str, 0, len+1);WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);if(wstr) 
delete[] wstr;return str;}


//GB2312到UTF-8的转换char* G2U(const char* gb2312){int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);wchar_t* wstr = new wchar_t[len+1];memset(wstr, 0, len+1);MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);char* str = new char[len+1];memset(str, 0, len+1);WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);if(wstr) 
delete[] wstr;return str;}


原创粉丝点击