我正在用C ++编写程序来收听来自其他程序的tcp消息流,以便从网络摄像头提供跟踪数据。我连接了套接字,我收到了所有信息,但很难将其拆分成我想要的数据。
以下是数据的格式:
8字节标题: 4个字符串, 整数
32字节消息: 整数, 浮动, 浮动, 浮动, 浮动, 浮
这一切都被困在一个名为buffer的char数组中。我需要能够将不同的字节解析为我需要的原语。我已经尝试制作较小的子数组,如headerString,通过循环填充并复制缓冲区数组的前4个元素,我确实打印出正确的听觉('CCV')。但是,当我尝试使用下一个元素(获取整数)并尝试将其打印出来时,我会打印出奇怪的ascii字符。我尝试使用stdlib.h中的atoi方法将headerInt数组转换为整数,但它总是打印出零。
我已经使用优秀的unpack方法在python中完成了这个,是C ++中的任何替代方法吗?
非常感谢任何帮助,
约旦
链接
答案 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
。