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实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Windows命令之tasklist命令用法详解(Windows查看进程)

《Windows命令之tasklist命令用法详解(Windows查看进程)》tasklist命令显示本地计算机或远程计算机上当前正在运行的进程列表,命令结合筛选器一起使用,可以按照我们的需求进行过滤... 目录命令帮助1、基本使用2、执行原理2.1、tasklist命令无法使用3、筛选器3.1、根据PID

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word

SpringBoot接收JSON类型的参数方式

《SpringBoot接收JSON类型的参数方式》:本文主要介绍SpringBoot接收JSON类型的参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、jsON二、代码准备三、Apifox操作总结一、JSON在学习前端技术时,我们有讲到过JSON,而在

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

Windows server服务器使用blat命令行发送邮件

《Windowsserver服务器使用blat命令行发送邮件》在linux平台的命令行下可以使用mail命令来发送邮件,windows平台没有内置的命令,但可以使用开源的blat,其官方主页为ht... 目录下载blatBAT命令行示例备注总结在linux平台的命令行下可以使用mail命令来发送邮件,Win