【问题标题】:Extract first two digits of hex (UInt32 *) and convert to int提取 hex (UInt32 *) 的前两位数字并转换为 int
【发布时间】:2010-11-22 19:59:31
【问题描述】:
我有一堆存储为 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,但我认为这不适用于十六进制。
【问题讨论】:
标签:
objective-c
hex
numbers
digits
【解决方案1】:
这听起来绝对像是字节顺序问题。不管是不是,简单的位移都应该可以完成这项工作:
uint32_t saneValue = insaneValue >> 24;
【解决方案2】:
Objective C 本质上是 C,上面有额外的东西。您通常的位移操作(my_int >> 24 或其他)应该可以工作。
【解决方案3】:
尝试使用函数NSSwapInt(),即
int x = 0x12345678;
x = NSSwapInt(x);
NSLog (@"%x", x);
应该打印“78563412”。
【解决方案4】:
除以 0x1000000 应该有效(即除以 16^6 = 2^24,而不是 10^6)。这与将位右移 24 位相同(我不知道 ObjC 语法,抱歉)。
【解决方案5】:
由于您期望每个值 endianness 看起来像是混淆了 - 您加载了一个大端数,然后将其解释为小端,反之亦然,导致字节顺序错误。
例如,假设我们在大端机器上以 32 位存储数字 104。在内存中,字节为:00 00 00 68。如果您将其加载到小端机器上的内存中,这些字节将被解释为 68000000。
你是从哪里得到这些数字的?您需要将它们转换为机器字节顺序吗?