在c++中从size_t转换为uint8_t
Casting/converting from size_t to uint8_t in C++?
我正在尝试编写一些代码,使用boost::asio的套接字从一端(客户端)发送消息到另一端(服务器)。
我现在的具体目标是在每条正在发送的消息前加上一个1字节的无符号整数(uint8_t),告诉接收者消息的其余部分有多少字节长。
请注意,我存储和传输大小为uint8_t而不是size_t的原因是因为我想确保它在两台机器上都是1字节。稍微搜索一下就会发现,在机器A和机器B上,size_t的大小可能不同,这可能会把事情搞砸。
这里我在计算消息的长度。该消息仅由两部分组成:uint16_t,后面是一个变量"data",这是一个(void*)-cast内存块,将服务于不同的目的(目标机器有解释该数据的方法,但我不会在这里进入)。
uint8_t sizeOfMessage = sizeof(uint16_t) + sizeof(data);
在这个例子中,sizeof(data) == 4,所以sizeOfMessage应该等于6(因为uint16_t是一个2字节的整数)。但是,如果我std::cout <<sizeOfMessage,显示的不是6,而是一个特殊字符:黑桃(就像牌的花色一样)。查看VS2010的调试器中的数据,它显示为6 '-'。然而,如果我将sizeOfMessage定义为size_t并将其打印出来,一切都很好(当然,我不能通过网络发送它,因为size_t的字节大小不能保证从一台机器到另一台机器)。
我认为这意味着在算术之后如何将size_t转换为uint8_t时出现了问题。sizeof返回size_t,所以我的代码正在做的是添加两个size_t,然后将其转换为uint8_t。
我的结论是正确的,值没有被正确地转换吗?如果有,我该如何解决这个问题?
分配给您的小(uint8_t)变量的值不是一个可打印的ASCII字符代码,将显示为'6'。相反,它是一个二进制值,相当于在源代码中编码' 06'。如果您的数据传输协议使用二进制代码字节,那么您可能就可以了。接收程序在其(uint8_t)的实例中得到什么,它读取一个字节(char) ?当然,使用(uint8_t)限制你的总消息长度为0到255(但你知道)。
uint8_t
通常是char
类型的typedef,并且它们被重载以格式化输出作为字符打印,而不是作为数字。不幸的是,这是c++格式化I/O中比较难看的一面,因为您必须将其转换为整数才能打印:
char c;
unsigned char u;
std::cout << (unsigned int)(unsigned char)(c) << std::endl
<< (unsigned int)(u) << std::endl;
uint8_t
在您的系统中是一个unsigned char
,因此输出它时将其写成一个字符而不是一个整数,该字符的值为6。
- 从值小于256的uint16到uint8的Endian安全转换
- 将 Uint8(浮点AUDIO_F32)转换为int16_t(16 位 PCM)
- 错误:无法将'uint8* {aka unsigned int*}'转换为"常量emxArray_uint8_T*"?
- 将具有不同字段的结构转换为 uint8 的数组
- 如何将 uint8 列表转换为其相应的有符号值
- 如何将元素从 Swift 中的 [UnsafeMutablePointer<UInt8>] 转换为 C++ 中的 UInt8 *
- 从字符串转换为 uint8,反之亦然
- 将 UInt8 C++值转换为 C# 字节数组
- 警告缩小转换范围(uint32 到 uint8)
- 将 uint8 转换为范围为 0-1 的浮点数的最有效方法
- 将 Uint8 转换为无符号字符 RGB 值
- 将uint8的矢量转换为ascii十六进制字符串的更好方法
- 从std::string转换为uint8
- Jagged Uint8数组转换为C#字节
- 将"wstring"转换为"const UInt8 *"
- 我如何将bitset转换为字节/uint8数组
- 如何在c++中将UINT8转换为UINT32 ?
- 我如何将uint8_t (SDL中的Uint8)转换为字符串
- 将uint8 vector类型的元素转换为stringstream类型
- Node.js 6增加了将Buffer.from()转换为const UInt8*的功能