2017-01-30 63 views
1

我需要将字节数组转换为浮点数组。我通过网络连接获取字节,然后需要将它们解析为浮点数。数组的大小不是预先定义的。 这是迄今为止使用工会的代码。你有什么建议如何让它跑得更快?将4字节转换为浮点数的最快方法C++

int offset = DATA_OFFSET - 1; 
UStuff bb; 
//Convert every 4 bytes to float using a union 
for (int i = 0; i < NUM_OF_POINTS;i++){ 
    //Going backwards - due to endianness 
    for (int j = offset + BYTE_FLOAT*i + BYTE_FLOAT ; j > offset + BYTE_FLOAT*i; --j) 
    { 
     bb.c[(offset + BYTE_FLOAT*i + BYTE_FLOAT)- j] = sample[j]; 
    } 
    res.append(bb.f); 
} 
return res; 

这是我使用

union UStuff 
{ 
     float f; 
     unsigned char c[4]; 
}; 
+0

_“我通过网络连接获取字节,然后需要将它们解析为浮点数。”_如果来自不同计算机,您应该更好地定义“浮点数”。 –

+0

_“您对如何使其运行速度更快有什么建议?”_ SO不是优化服务! –

+1

定义“转换”。有许多可能的映射。你已经使用了“解析”这个词,但是你的程序不会进行任何解析。 –

回答

5

技术上工会则不允许通过C++中的union输入,双关语,但你被允许做C中的行为你的代码未定义。

撇开这个重要的行为点:即使这样,你假设float在所有机器上都以相同的方式表示,事实并非如此。你可能认为一个float是一个32位IEEE754小端数据块,但它不是那。

不幸的是,最好的解决方案将结束较慢。浮点数据的大多数序列化是通过进入和退出一个字符串来执行的,在你的情况下,你很可能解决这个问题,因为你可以将它们表示为一个数组。所以你唯一的争论就是搞清楚的编码的数据。任务完成!

+0

恕我直言,任何C++编译器都不会通过联合工作“按预期”进行类型双击。不管标准说什么。 –

+0

@ErikAlapää:我倾向于同意你的看法,特别是如果其中一个工会成员是'unsigned char'数组。 – Bathsheba

+0

一个有趣的选择是使用编译器属性,例如gcc:s may_alias。 May_alias是用来说数组不重叠的'严格关键字'的反转,所以如果标准化的话may_alias会更有用。然后,C和C++可能更像是他们用作的“便携式汇编程序”。 –

相关问题