将char数组吐入一系列int和float

时间:2011-07-04 14:28:19

标签: c++ sockets arrays

我正在用C ++编写程序来收听来自其他程序的tcp消息流,以便从网络摄像头提供跟踪数据。我连接了套接字,我收到了所有信息,但很难将其拆分成我想要的数据。

以下是数据的格式:

8字节标题: 4个字符串, 整数

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

这一切都被困在一个名为buffer的char数组中。我需要能够将不同的字节解析为我需要的原语。我已经尝试制作较小的子数组,如headerString,通过循环填充并复制缓冲区数组的前4个元素,我确实打印出正确的听觉('CCV')。但是,当我尝试使用下一个元素(获取整数)并尝试将其打印出来时,我会打印出奇怪的ascii字符。我尝试使用stdlib.h中的atoi方法将headerInt数组转换为整数,但它总是打印出零。

我已经使用优秀的unpack方法在python中完成了这个,是C ++中的任何替代方法吗?

非常感谢任何帮助,

约旦

链接

CCV packet structure

Python unpack method

2 个答案:

答案 0 :(得分:4)

缓冲区仅包含您通过的内容读取的原始图像 网络。您必须将缓冲区中的字节转换为其他内容 你想要的格式。字符串很简单:

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 是实现定义,但在实践中,上述几乎可以工作 无处不在。)

你提供的关于花车代表的唯一提示是 消息格式:32字节,减去4字节整数,留下28字节 5个花车;但28不会进入五,所以我甚至无法猜测 浮子的长度(除了那里必须有一些填充物 某处)。但转换浮点可能或多或少 如果外部格式与内部格式不完全相同则很复杂 格式。

答案 1 :(得分:-1)

这样的事情可能有用:

struct {
    char string[4];
    int integers[2];
    float floats[5];
} Header;

Header* header = (Header*)buffer;

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