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

2024-06-14 21:08

本文主要是介绍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
它本意是一个 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;
}


这篇关于PoEdu-Windows班-002 常用字符类型及转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1061512

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎