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

标签 c++ byte data-conversion

[编辑]我想以网络字节顺序将 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]);

我怎样才能摆脱这个警告,或者让这个数字转换更简单或更清晰?

最佳答案

((uint8_t*)&net_order)

这是一个指向 net_order 的指针,被转换为一个 uint8_t 指针

((uint8_t*)&net_order)[i]

这是 net_order 底层表示的第 i 个字节。

(const char*)((uint8_t*)&net_order)[i]

这与上面相同,但被粗暴地转换为 const char *。这是一个无效的指针,这是编译器警告你的;即使只是创建这个指针也是未定义的行为,以任何方式使用它几乎肯定会导致崩溃。

请注意,即使您以某种方式设法让这个拼凑工作,strcat 仍然是错误的函数,因为它处理以 NUL 结尾的字符串,而在这里您试图将二进制数据放入其中您的缓冲区和二进制数据自然可以包含嵌入的 NUL。 strcat 将在第一个 NUL 处附加(并在第二个参数中的第一个 NUL 处停止),而不是在“真实”结尾处。

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

关于c++ - 将 uint64_t 转换为字节时从不同大小的整数转换为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51911792/

相关文章:

c - 如何用c语言编写一个简单的程序来将克转换为毫克,反之亦然

mysql - 如何将存储在 XML 文件中的数据转换成关系数据库(MySQL)?

c++ - 是否可以在声明后设置 constexpr 数组中元素的值?

java - java中字符串到字节的转换

C++ 字节到位转换然后打印

java - 无法使用 HTTP 客户端传输图像

delphi - 如何将 AnsiString 转换为 TBytes,反之亦然?

c++ - 从数据库填充 QTreeView 作为父节点和子节点

c++ - BackgroundSubtractorMOG灵敏度

c++ - 当指定的数据成员是引用类型时,关于类成员访问的问题