将uint64_t转换为字节时,从不同大小的整数转换为指针

时间:2018-08-18 19:11:41

标签: c++ byte data-conversion

[EDIT]我想以网络字节顺序将uint64_t写入char *数组,以带有sendto的UDP数据报的形式发送,uint64_t具有8个字节,因此我将其转换如下:

void strcat_number(uint64_t v, char* datagram) {
    uint64_t net_order = htobe64(v);
        for (uint8_t i=0; i<8 ;++i) {
    strcat(datagram, (const char*)((uint8_t*)&net_order)[i]);
    }
}

请给我

警告:从不同大小的整数强制转换为指针[-Wint-to-pointer-xast]          strcat(数据报,(const char *)((uint8_t *)&net_order)[i]);

如何摆脱这种警告,或者这个数字转换起来更简单或更清晰?

1 个答案:

答案 0 :(得分:1)

class PointIterator:
    def __init__(self, point):
        self.values = [point.x, point.y]
    def __next__(self):
        try:
            return self.values.pop(0)
        except IndexError:
            raise StopIteration
    def __iter__(self):
        return self

class Point:
    # ... other code
    def __iter__(self):
        return PointIterator(self)

这是指向((uint8_t*)&net_order) 的指针,已转换为net_order指针

uint8_t

这是((uint8_t*)&net_order)[i] 的基础表示的第i个字节。

net_order

与上面相同,但残酷地强制转换为(const char*)((uint8_t*)&net_order)[i] 。这是一个无效的指针,这是编译器警告您的内容。即使只是创建此指针也是未定义的行为,以任何方式使用它几乎肯定会导致崩溃。

请注意,即使您设法以某种方式使此合并工作正常,const char *仍然是错误的函数,因为它处理的是NUL终止的字符串,而在这里您尝试将二进制数据放入缓冲区中时,二进制数据自然可以包含嵌入式NUL。 strcat将附加在第一个NUL处(并在第二个参数的第一个NUL处停止),而不是在“实际”端。

如果要构建二进制数据的缓冲区,则必须使用直接的strcat,最重要的是,您不能使用依赖于最终NUL来了解字符串结尾的与字符串相关的函数,但是您必须明确跟踪您使用了多少字节(即数据报中的当前位置)。