我正在尝试编写一些代码,使用 boost::asio 的套接字将消息从一端(客户端)发送到另一端(服务器)。
我现在的具体目标是在发送的每条消息前加上一个 1 字节的无符号整数 (uint8_t),告诉接收者消息的其余部分有多少字节长。
请注意,我将大小存储和传输为 uint8_t 而不是 size_t 的原因是因为我想确保它在两台机器上都是 1 个字节。一点谷歌搜索表明 size_t 在机器 A 和机器 B 上的大小可能不同,这可能会搞砸。
所以在这里我正在计算消息的长度。该消息仅由两部分组成:一个 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。
我的结论是否正确,即该值未正确转换?如果是这样,我该如何解决这个问题?
提前致谢。