Objective-C将整数转换为十六进制值

14

我有一个这样初始化的字典...

keyDictionary = [[NSDictionary dictionaryWithObjects:values forKeys:keys]retain];

其中keys是一个包含字母和其他字符的NSArray,而values是一个包含这些字符对应的USB十六进制键码的unsigned char数组。

USB键码是从0x04到0xE7的十六进制值。我正在尝试根据键盘上按下的键来创建这两者之间的映射关系。

values数组的创建方式如下...

NSArray *values = [NSArray arrayWithObjects:                   [NSNumber numberWithUnsignedChar:0x04]/*A*/,
                  [NSNumber numberWithUnsignedChar:0x05]/*B*/, /*ETC*/]; 

理想情况下,当我运行这段代码时... 其中 character == @"I"

- (uint8) getUSBCode:(NSString *)character
{
    NSNumber *val = [keyDictionary objectForKey:character];

    return (uint8)[val unsignedCharValue];
}
我期望得到0x0C,但我却以int类型得到了12(想想也是有道理的)。我需要保留十六进制值,而不需要字符串值。我需要直接转换成十六进制值或更好的存储方式。 uint8只是一个typedef unsigned char。
编辑:之前我表述不够清晰。这是我所需要的:
这些代码的十六进制值需要被发送到公司内部网络上。此外,按下的键值正在从大端序(或小端序,我现在逃避了)转换为另一种格式,然后被传输到内部网络上。我知道这些值是以二进制形式存储的,但我需要以十六进制形式传输它们。
此外,我之前说我从函数得到了12。我是从调试器中读取的12,而不是实际获取的值。这可能是我感到困惑的原因。

1
12进制和0x0C是同一个数字。您可以尝试将返回值与0x0C进行比较,看看它们是否相同。例如:if(retval == 0x0c) NSLog(@"They're the same"); else NSLog(@"They're not the same");通过USB串行管道传递的位在十进制12或十六进制C时将保持不变:...00001100 - Stephen Furlani
你们在技术上都是对的。当我问这个问题时,我真是个白痴。出于某种原因,我假设我必须以十六进制发送代码,但最终,我们实际上是在发送二进制。 - DavidAndroidDev
3个回答

54

10进制中的12 等于 0x0c(16进制)。

如果你想将其以16进制形式打印出来,请使用%x格式说明符,例如:

NSLog(@"Hex value of char is 0x%02x", (unsigned int) c);
如果你想在调试器中以十六进制的形式查看它(假设使用Xcode 3.2.x),右键单击变量并选择十六进制作为格式。

0

你知道 int 类型是以二进制形式存储的(即“十六进制”值始终不被保留),因此我理解你的问题是关于在屏幕上打印输出。
你应该可以使用 格式说明符 来实现这个目的,例如 %0x


0
你的-getUSBCode:方法返回的值不是两个小数位,而是一个8位字节。 "12"和"0x0C"都是表示该字节值的字符串,因此说你想要"0x0C"但又不想要一个字符串是矛盾的。

你说得对。我想我的问题表述不够清楚。现在我要修改它。 - DavidAndroidDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接