【问题标题】:Hex Values Get Weird After 127十六进制值在 127 之后变得奇怪
【发布时间】:2013-06-17 22:43:26
【问题描述】:

我正在尝试显示 0-255 之间的所有十六进制字符。我能够表示从 0x00 到 0x7f 的二进制数据,但是一旦我超过 0x7f,它看起来像是在进行某种类型的 UTF 格式化,并开始添加 C。这就是我的做法”

unichar value = 0;

for (value = 0; value < 255; value++) {

    [test writeExample:[NSString stringWithFormat:@"%C", value]];
}

有谁知道如何更改它以使其在 0x7f 之后继续显示正确​​的十六进制?我用 %c 试过 char,用 %C 试过 unichar。我已经能够表示 0x00 - 0x7f,但我无法表示扩展的 ascii 字符 0x80 - 0xFF。

【问题讨论】:

  • 是的,先生,%X 没有用。
  • 尝试NSLog(@"%X", 255); 会得到什么?顺便说一句,你的 for 循环在你到达 255 之前结束,这是一个有效的十六进制 (FF)。
  • 而且,当我将 %X 插入到上述循环中时,它会一直运行下去。
  • 这几乎是您上一个问题的重复。再次,将线一分为二。 NSString *val = [NSString stringWithFormat:@"%C", value];[test writeExample:val];。这样你就可以看出是哪一行出了问题。
  • 您想向writeExample: 方法发送什么?使用%x 为您提供每个整数值的十六进制表示。使用%C 可以为您提供每个整数值的字符表示。两个截然不同的结果。

标签: objective-c utf-8 hex


【解决方案1】:

根据我对您的问题和Apple Dev Docs on String Formatters 的理解,在将整数表示为十六进制值的情况下使用的正确字符串格式化程序是使用格式化程序%x。故事结局。

问题似乎在于您的writeExample: 方法。所以也许你应该尝试类似以下的方法:

- (void)writeExample:(unichar)value
{
    NSLog(@"0x%02x", value);
}

它可能并不完美,但至少它是一个起点。这将打印一个十六进制表示。

如果你想把它作为一个字符串发送,你可以;只需将方法更改为:

- (void)writeExample:(NSString*)value
{
    unichar val = [value intValue];
    NSLog(@"0x%02x", val);
}

并发送格式为%d而不是%c的字符串:

[test writeExample:[NSString stringWithFormat:@"%d", value]];

没有更多细节,这是我能给你的最佳答案。如果您提供更多详细信息,那么我将很乐意编辑我的答案以帮助您准确了解发生了什么。

【讨论】:

  • 你为什么要把value除以256?
  • 因为如果超过255,(例如256),应该是1x00吧?还是我错了?我对十六进制的了解有限......
  • 如果十六进制不能超过 255,那么它就是NSLog(@"0x%02x", value);
  • 谁知道? OP 在描述他们的要求方面做得很糟糕。但一般来说,十进制256的十六进制值就是100,也可以表示为0x100。你所拥有的是我从未见过的格式。
  • 只剩下一个大问题 - 在 OP 的代码中,他们将 NSString 传递给 writeExample: 方法,而不是 unichar
猜你喜欢
  • 1970-01-01
  • 2018-04-14
  • 2014-02-12
  • 1970-01-01
  • 2013-12-08
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
相关资源
最近更新 更多