提取十六进制的前两位数字(UInt32 *)并转换为int

时间:2009-08-26 00:11:00

标签: objective-c hex numbers digits

我有一堆十六进制值存储为UInt32 *

  • 2009-08-25 17:09:25.597粒子[1211:20b] 68000000
  • 2009-08-25 17:09:25.598粒子[1211:20b] A9000000
  • 2009-08-25 17:09:25.598粒子[1211:20b] 99000000

当我按原样转换为int时,我认为当它们应该是0-255时,它们是疯狂的值。我想我只需要提取前两位数字。我该怎么做呢?我尝试除以1000000,但我认为它不适用于十六进制。

5 个答案:

答案 0 :(得分:3)

因为你期待<对于每个值只有255,并且在您发布的样本数据中只设置了最高字节,看起来您的endianness混淆了 - 您加载了一个大端数字,然后将其解释为小端,反之亦然,导致字节顺序错误。

例如,假设我们在大端机器上以32位存储了数字104。在内存中,字节数为:00 00 00 68.如果将其加载到小端机器上的内存中,则这些字节将被解释为68000000。

你从哪里得到数字?你需要将它们转换为机器字节顺序吗?

答案 1 :(得分:2)

目标C基本上是C,顶部有额外的东西。您通常的位移操作(my_int>> 24或其他)应该有效。

答案 2 :(得分:1)

这听起来像是一个字节序问题。无论是否,简单的位移应该做的工作:

uint32_t saneValue = insaneValue >> 24;

答案 3 :(得分:0)

除以0x1000000应该有效(即16 ^ 6 = 2 ^ 24,而不是10 ^ 6)。这与将位向右移动24相同(我不知道ObjC语法,对不起)。

答案 4 :(得分:0)

尝试使用函数NSSwapInt(),即

int x = 0x12345678;
x = NSSwapInt(x);
NSLog (@"%x", x);

应打印“78563412”。