[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]);
如何摆脱这种警告,或者这个数字转换起来更简单或更清晰?
答案 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来了解字符串结尾的与字符串相关的函数,但是您必须明确跟踪您使用了多少字节(即数据报中的当前位置)。