【发布时间】:2011-12-10 13:18:46
【问题描述】:
我正在尝试编写一些代码,使用 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 6 '-' 。但是,如果我将 sizeOfMessage 定义为 size_t 并将其打印出来,一切都很好(但当然,我不能通过网络发送它,因为不能保证从一台机器到下一台机器的 size_t 的字节大小)。
我认为这意味着在算术之后如何将 size_t 转换为 uint8_t 出现问题。 sizeof 返回一个 size_t,所以我的代码正在做的是添加两个 size_t,然后将其转换为一个 uint8_t。
我的结论是否正确,即该值未正确转换?如果是这样,我该如何解决?
提前致谢。
【问题讨论】: