c++ - 弄清楚网络、十六进制和 ascii 如何交互

标签 c++ udp hex ascii

我最近被分配到一个 C++ 项目,该项目涉及通过 UDP 在计算机之间发送信息。当数据包到达时,我有一个程序可以接受数据并将其显示为原始的十六进制字符串。但是,我很难准确掌握整个过程应该如何运作。十六进制字符串应该包含几个字段(例如,一个 4 字符数组、一些 float_32 和一些 uint_32)。

如何将这个字符串的各个部分翻译成正确的变量类型?第一个值是一个 ASCII 标题,非常简单;十六进制字符串中的前八个字符是 ASCII 字的十六进制表示(0x45 十六进制可以直接转换为大写字母 E)。但是下一个值,一个 32 位 float ,对我来说并没有真正的意义。十六进制值“42 01 33 33”和浮点值“32.3”之间的关系是什么(给定的例子)?

我有点不知所措,我觉得我缺少一些关于数字系统工作方式的重要信息。

最佳答案

C 中的所有类型都有一个表示(对于大多数类型而言,它由特定的实现定义)。大多数 C 实现使用 IEEE 754用于表示 float 类型(这实际上可能是 C 和 C++ 的要求,但从内存来看它不是)。维基百科文章解释了 float 类型在内存中的表示方式。在大多数 C 和 C++ 实现中,float 是 32 位类型,double 是 64 位类型。因此,在这些实现中,float 是 4 个字节宽,double 是 8 个字节宽。

小心,因为字节顺序可能不同。一些架构以小端存储 float 类型,一些以大端存储。还有一篇关于 endianness 的维基百科文章也是。

要将字节复制到 float 类型,您必须确保 float 类型的大小与您拥有的字节数相同,然后您可以将字节一个一个地“复制”到 float 类型中类型。像这样的东西会给你它的要点:

unsigned char rep[] = { 0x42, 0x01, 0x33, 0x33 };
float someFloat;

if (sizeof(someFloat) == 4)
{
    memcpy(&someFloat, rep, sizeof(someFloat));
}
else
{
    // throw an exception or something
}

还有其他方法可以将字节复制到浮点类型,但要小心“违反规则”(类型双关等)。另外,如果结果值不正确,可能是字节顺序错误,需要将字节倒过来复制,这样表示中的第4个字节就是float的第1个字节。

关于c++ - 弄清楚网络、十六进制和 ascii 如何交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8811465/

相关文章:

c++ - strcoll 错误 (C++)

c++ - Lua C API 嵌套表段。过错

java - 多个线程监听一个 UDP 端口?

c# - 将整数转换为字节

hex - 为什么以十六进制(二进制)而不是纯文本保存数据文件?

C++/VS 2012 - 多项目解决方案 : Linker errors in one project but not another

c++ - 在 C++ 上读取二进制数据,其中不同的列具有不同的数据类型

java - UDP广播和接收

udp - 如何在浏览器上播放UDP流?

java - 将十六进制字符串(hex)转换为二进制字符串