【问题标题】:64bit hex to decimal in CC中的64位十六进制到十进制
【发布时间】:2015-11-10 08:29:54
【问题描述】:

我正在从 Wireshark 读取 pcap 文件,并使用 u_char 以 8 位存储数据。一部分数据是 64 位的,所以我需要将八个 8 位数字组合成/读取为一个 64 位数字,然后将其转换为十进制。 例如,这是我目前拥有的

Hex: 3f e2  da  2f 8b  de  c5  f4
Dec: 63 226 218 47 139 222 197 244

这就是我目前想要的,

Hex: 3fe2da2f8bdec5f4
Dec: .589134

要结合 8 个 1bytes,我试过了:

long long int a;
a = (data[j] << 56) | (data[j+1] << 48) | (data[j+2] << 40) | (data[j+3] << 32) | (data[j+4] << 24) | (data[j+5] << 16) | (data[j+6] << 8) | data[j+7];
printf("%lld", a);

output: -1073815553

非常感谢您的帮助。谢谢。

【问题讨论】:

  • 句号部分暗示它根本不是整数...

标签: c hex decimal converter wireshark


【解决方案1】:

看起来 OP 想要用 binary64 double 覆盖一个 8 字节整数。

这样的代码可以移植到许多机器上,但肯定不能移植到所有 C 机器上,因为它假设了很多东西,比如 double 的形式。

int main(void) {
  union {
    double d;
    unsigned long long ull;
  } u;
  u.d = 0.589134;
  printf("%016llX\n", u.ull);
  u.ull = 0x3fe2da2f8bdec5f4;
  printf("%lf\n", u.d);
  return 0;
}

3FE2DA2F8BDEC5F4
0.589134

【讨论】:

  • @Eugene Sh.Nice 链接到网站并带有“0.589134”值。
  • 是的,这就是我要找的。我的主要问题是取 8 个 1 字节的数字并将它们合并为 1 个 8 字节的数字。
  • @mchoy25 u.ull = Hex[0]*1LL &lt;&lt; 56 + Hex[1]*1LL &lt;&lt; 48 + Hex[2]*1LL &lt;&lt; 40 + ... Hex[7]*1LL &lt;&lt; 0; 是一种可移植的、与字节序无关的方法。要获得更好的答案,请发布您尝试过的内容。
  • @chux 你写的和我试过的很相似。我编辑了我的帖子以展示我所做的事情。
猜你喜欢
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 2018-07-26
  • 2014-04-18
  • 2014-11-30
  • 2011-02-04
相关资源
最近更新 更多