将一个char数组转换为int型和浮点型的序列
Spitting a char array into a sequence of ints and floats
我正在用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
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 从.txt文件中读取浮点型数字并在公式中使用它们
- 将整型转换为浮点型时检测溢出
- C++ 中的程序集内联(浮点型和_cdecl型)
- 是否存在 x + 1 == x 类型的浮点型值 x
- 从浮点型到 int 的转换在所有平台和处理器架构中是否一致?
- NaN 在浮点型和双精度型之间的类型转换
- 无法将浮点型*类型转换为字符*
- 如何分别为整型和浮点型专门化模板函数
- 浮点型功能
- 将字符串拆分为 2 个向量.将字符串转换为浮点型时出现问题
- C++11 type_traits:若为浮点型,则为同一类型;若为整型,则为双类型
- 完全递增/递减浮点型数字
- C++,<int>浮点计算static_cast,可能丢失整数
- 从浮点型到整数的奇怪转换
- 访问静态 constexpr 浮点型成员时的未定义引用
- 将浮点型数组转换为双精度型
- 如何为基本类型(浮点型)编写替换,以覆盖 运算符 == C++
- 如何使用 printf 查看浮点型变量
- 将一个char数组转换为int型和浮点型的序列