我需要与没有nthol功能的8位设备通信。使用协议缓冲库也是不可能的。
跟随C函数会产生相同的输出字符串,无论它运行的是什么架构(不同的字节序,不同的位数):
void encode(uint32_t input, unsigned char* buf, int buf_len) {
assert(sizeof(uint32_t) <= buf_len);
buf[0] = input >> 24 & 0xFF;
buf[1] = input >> 16 & 0xFF;
buf[2] = input >> 8 & 0xFF;
buf[3] = input & 0xFF;
}
以下函数是否正确读取此类编码字符串并在所有体系结构上生成相同的结果:
void decode(const unsigned char* buf, int buf_len, uint32_t* output) {
assert(sizeof(uint32_t) <= buf_len);
*output = buf[0];
*output <<= 8;
*output |= buf[1];
*output <<= 8;
*output |= buf[2];
*output <<= 8;
*output |= buf[3];
}
是否有可能在8位处理器上32位整数由于某种原因无法正确处理?
答案 0 :(得分:1)
是的,它会起作用。无论机器具有哪种字节顺序或字大小,C shift操作员都会做正确的事情。
请记住在与此协议通信的所有程序中执行完全相同的操作。
答案 1 :(得分:1)
是的,看起来不错。几条评论:
uint8_t
而不是假设unsigned char
是8位。output
。decode()
功能更清晰。-
uint32_t decode(const uint8_t *buf, size_t buf_len) {
uint32_t out = 0;
assert(sizeof out <= buf_len);
out |= buf[0];
out <<= 8;
out |= buf[1];
out <<= 8;
out |= buf[2];
out <<= 8;
out |= buf[3];
return out;
}