将一个char数组转换为int型和浮点型的序列

Spitting a char array into a sequence of ints and floats

本文关键字:int 浮点型 转换 一个 数组 char      更新时间:2023-10-16

我正在用c++写一个程序来监听来自另一个程序的tcp消息流,以从网络摄像头获得跟踪数据。我已经连接了套接字,我正在获取所有的信息,但很难将其分割成我想要的数据。

输入的数据格式如下:

8字节头:4个字符串;整数

32字节消息:整数,浮动,浮动,浮动,浮动,浮动

这些都被保存在一个名为buffer的字符数组中。我需要能够将不同的字节解析成我需要的原语。我试过制作更小的子数组,如headerString,它是通过循环和复制缓冲区数组的前4个元素填充的,我确实得到了正确的听力('CCV ')打印出来。但是当我尝试对下一个for元素做同样的事情(得到整数)并试图打印出来时,我得到了奇怪的ascii字符被打印出来。我试过用stdlib.h的atoi方法将headerInt数组转换为整数,但它总是打印出零。

我已经在python中使用优秀的解包方法完成了这一点,在c++中有任何替代方案吗?

任何帮助都非常感谢,

约旦

链接

CCV包结构

Python解包方法

缓冲区只包含您在网络。你必须将缓冲区中的字节转换成任何形式你想要的格式。字符串很简单:

std::string s(buffer + sOffset, 4);

(当然,假设内部字符编码是相同的如文件—可能是ASCII的扩展)

其他的更复杂,并且依赖于外部数据。从标题的描述,我收集比整数是四个字节,但这仍然没有告诉我他们表示。根据具体情况,可以:

int getInt(unsigned char* buffer, int offset)
{
    return (buffer[offset    ] << 24)
        |  (buffer[offset + 1] << 16)
        |  (buffer[offset + 2] <<  8)
        |  (buffer[offset + 3]      );
}

int getInt(unsigned char* buffer, int offset)
{
    return (buffer[offset + 3] << 24)
        |  (buffer[offset + 2] << 16)
        |  (buffer[offset + 1] <<  8)
        |  (buffer[offset    ]      );
}

可能就可以了。的其他四字节表示整数是可能的,但它们非常罕见。类似地,将移位和或的无符号结果转换为int实现是定义的,但在实践中,以上几乎可以工作吗无处不在。)

您给出的关于浮点数表示的唯一提示是in消息格式:32字节,减去一个4字节的整数,剩下28字节5漂浮;但是28不能整除5,所以我甚至猜不出浮点数的长度(除了必须有一些填充)的地方)。但是转换浮点数可以是多或少如果外部格式与内部格式不完全相同,则会很复杂格式。

可以这样做:

struct {
    char string[4];
    int integers[2];
    float floats[5];
} Header;
Header* header = (Header*)buffer;

你应该检查sizeof(Header) == 32