本文主要是介绍PoEdu-Windows班-002 常用字符类型及转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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
但是在 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;
}
这篇关于PoEdu-Windows班-002 常用字符类型及转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!