0

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

我的结论是否正确,即该值未正确转换?如果是这样,我该如何解决这个问题?

提前致谢。

4

3 回答 3

2

分配给您的小 (uint8_t) 变量的值不是显示为“6”的可打印 ASCII 字符代码。相反,它是一个二进制值,相当于在您的源代码中编码 '\006'。如果您的数据传输协议确实适用于二进制代码字节,那么您可能很高兴。接收程序在其读取一个字节 (char) 的 (uint8_t) 实例中得到什么?当然,使用 (uint8_t) 会将您的总消息长度限制为 0 到 255(但您知道这一点)。

于 2011-10-19T01:07:09.260 回答
1

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;
于 2011-10-19T01:04:17.187 回答
0

uint8_t在您的系统中是一个unsigned char,因此输出它会将其写为字符而不是整数,即值为 6 的字符。

你的演员阵容没有任何问题。

于 2011-10-19T01:00:50.207 回答