C++中BYTE、WORD、DWORD的作用以及区别

https://blog.csdn.net/DY_1024/article/details/84101795

在VC++6.0中,BYTE、WORD、DWORD实际上是一种无符号整形,在WINDEF.h中被定义

typedef unsigned char BYTE;
 
typedef unsigned short WORD;
 
typedef unsigned long DWORD;


也就是说BYTE是无符号char类型,WORD是无符号short型,DWORD是无符号long型

在VC++6.0中,char的1字节,short是2字节,int和long都是4字节,因此可以认为BYTE、WORD、DWORD定义的变量分别是1节,2字节,4字节。

即:BYTE = unsigned char,WORD = unsigned short,DWORD = unsigned long

DWORD 通常用来保存地址或者存放指针

其中WORD和DWORD的区别
定义WORD和DWORD其实主要是为了:1、便于移植;2、更为严格的类型检查

WORD固定是2字节,DWORD固定是4字节

int的话,随着操作系统的不同,有着不一样的字节数,在32位操作系统中是4字节,在16位操作系统就是2字节

在序列化的操作中,因为序列化是按照字节流存储的,为了保证不会错位,要求使用具有明确字节数目的数据类型
 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 C++ 算法,用于将 GB18030 编码转换成 Unicode 编码: ```c++ #include <iostream> #include <string> #include <vector> typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned int DWORD; // GB18030 编码转换成 Unicode 编码 std::wstring GB18030ToUnicode(const std::string& str) { std::wstring result; std::vector<BYTE> bytes(str.begin(), str.end()); int i = 0; while (i < bytes.size()) { if (bytes[i] <= 0x7F) { // ASCII 字符 result += (wchar_t)bytes[i]; i++; } else if (bytes[i] >= 0x81 && bytes[i] <= 0xFE) { // 双字节字符 if (i + 1 < bytes.size()) { WORD w = ((WORD)bytes[i] << 8) | ((WORD)bytes[i + 1]); if (w >= 0x8140 && w <= 0xFEFE && w != 0x817F && w != 0x8180) { // GBK/GB2312 编码范围内的汉字 result += (wchar_t)(0x4E00 + (w - 0x8140) / 0x100 * 0x40 + (w - 0x8140) % 0x100); } else if (w >= 0x8130 && w <= 0xA0FE) { // GB18030 编码范围内的汉字 DWORD dw = ((DWORD)w - 0x8130) / 10 * 0x100 + ((DWORD)w - 0x8130) % 10 + 0x10000; result += (wchar_t)dw; } i += 2; } else { break; } } else if (bytes[i] >= 0x80 && bytes[i] <= 0xBF) { // 单字节字符,不是汉字 result += (wchar_t)bytes[i]; i++; } else if (bytes[i] >= 0xC0 && bytes[i] <= 0xDF) { // 双字节字符,不是汉字 if (i + 1 < bytes.size()) { WORD w = ((WORD)bytes[i] << 8) | ((WORD)bytes[i + 1]); result += (wchar_t)(0x80 + (w - 0xC0A0)); i += 2; } else { break; } } else if (bytes[i] >= 0xE0 && bytes[i] <= 0xEF) { // 三字节字符 if (i + 2 < bytes.size()) { DWORD dw = ((DWORD)bytes[i] << 16) | ((DWORD)bytes[i + 1] << 8) | (DWORD)bytes[i + 2]; result += (wchar_t)dw; i += 3; } else { break; } } else { break; } } return result; } ``` 下面是一个简单的 C++ 算法,用于将 Unicode 编码转换成 GB18030 编码: ```c++ #include <iostream> #include <string> #include <vector> typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned int DWORD; // Unicode 编码转换成 GB18030 编码 std::string UnicodeToGB18030(const std::wstring& str) { std::string result; for (int i = 0; i < str.size(); i++) { if (str[i] <= 0x7F) { // ASCII 字符 result += (char)str[i]; } else if (str[i] >= 0x4E00 && str[i] <= 0x9FA5) { // GBK/GB2312 编码范围内的汉字 BYTE b1 = (BYTE)((str[i] - 0x4E00) / 0x40 + 0x81); BYTE b2 = (BYTE)((str[i] - 0x4E00) % 0x40 + 0x40); result += b1; result += b2; } else { // GB18030 编码范围内的汉字 DWORD dw = (DWORD)str[i]; if (dw >= 0x10000 && dw <= 0x10FFFF) { dw -= 0x10000; BYTE b1 = (BYTE)(dw / 0x1000 + 0x90); BYTE b2 = (BYTE)((dw % 0x1000) / 0x40 + 0x81); BYTE b3 = (BYTE)((dw % 0x1000) % 0x40 + 0x30); result += b1; result += b2; result += b3; } } } return result; } ``` 需要注意的是,这两个算法只是简单的示例代码,不能处理所有情况。在实际应用,需要根据具体需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值