Qt相当于Perl pack / unpack

时间:2014-05-31 19:28:04

标签: perl qt hex

以下是十六进制数据列表及其代表的浮点数:

e77ed8f8201a5440 = 78.4083
0000000000005540 = 82
4c541773e2185040 = 62.3888
0000000000005640 = 86

以下Perl代码使用pack / unpack来获得几乎正确的转换(正好是2):

use strict;
use warnings;

while (<DATA>)
{
   chomp;
   my $dat = $_;
   my $hval = pack "H*", $dat;
   my $fval = unpack "F", $hval;
   print "$dat .. $fval \n";
}

__DATA__
e77ed8f8201a5440
0000000000005540
4c541773e2185040
0000000000005640

输出:

e77ed8f8201a5440 .. 80.408262454435
0000000000005540   .. 84
4c541773e2185040  .. 64.3888213851762
0000000000005640 .. 88

这个打包/解压缩的Qt / C等价物是什么,或者用什么算法来转换&#34;十六进制浮动所以我可以这样做吗?

2 个答案:

答案 0 :(得分:1)

pack 'H*'是从十六进制字符对到相应字节的conversion

unpack 'F'是对double的强制转换。这可以使用memcpy来完成(以避免对齐问题),如下所示:

#include <stdio.h>
#include <string.h>

int main() {
   char bytes[] = { 0xE7, 0x7e, 0xd8, 0xf8, 0x20, 0x1a, 0x54, 0x40 };

   double d;
   memcpy(&d, bytes, sizeof(bytes));

   printf("%lf\n", d);
   return 0;
}

输出:

$ gcc -o a a.c && a
80.408262

请注意,这将在big-endian计算机上失败。在将这些字节复制到这些计算机上之前,您必须将其翻转。

答案 1 :(得分:1)

  

这个打包/解压缩的Qt / C等价物是什么,

#include <QString>
#include <QByteArray>
#include <algorithm>
#include <cstring>

...

QString value="e77ed8f8201a5440";
// convert the hex string to an array of bytes
QByteArray arr=QByteArray::fromHex(value);
// reverse if necessary
#if Q_BYTE_ORDER==Q_BIG_ENDIAN
std::reverse(arr.begin(), arr.end());
#endif
// if everything went right, copy the bytes in a double
if(arr.size()==sizeof(double))
{
    double out;
    std::memcpy((void *)&out, (void *)arr.data(), sizeof(double));
    // ...
}

也许你也可以使用QtEndian(而不是有条件地调用std::reverse而不是arr),但是不清楚这些函数是否可以在除了整数类型之外的任何函数上调用。< / p>

  

或用于&#34;转换&#34;的算法是什么?十六进制浮动所以我可以这样做吗?

您拥有的数据只是小端IEEE-754 double的原始内容的转储; &#34;算法&#34;只是将十六进制解码为它所代表的字节并将它们复制到double变量(如果我们在大端机器上则反转字节顺序)。