我正在用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