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

相关文章

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

Java轻松实现PDF转换为PDF/A的示例代码

《Java轻松实现PDF转换为PDF/A的示例代码》本文将深入探讨Java环境下,如何利用专业工具将PDF转换为PDF/A格式,为数字文档的永续保存提供可靠方案,文中的示例代码讲解详细,感兴趣的小伙伴... 目录为什么需要将PDF转换为PDF/A使用Spire.PDF for Java进行转换前的准备通过

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

Java中字符编码问题的解决方法详解

《Java中字符编码问题的解决方法详解》在日常Java开发中,字符编码问题是一个非常常见却又特别容易踩坑的地方,这篇文章就带你一步一步看清楚字符编码的来龙去脉,并结合可运行的代码,看看如何在Java项... 目录前言背景:为什么会出现编码问题常见场景分析控制台输出乱码文件读写乱码数据库存取乱码解决方案统一使

Java实现字节字符转bcd编码

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