在c++中从size_t转换为uint8_t

Casting/converting from size_t to uint8_t in C++?

本文关键字:uint8 转换 c++ size 中从      更新时间:2023-10-16

我正在尝试编写一些代码,使用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。