【问题标题】:Converting Hex String to ASCII String showing wrong result for 00将十六进制字符串转换为 ASCII 字符串,显示 00 的错误结果
【发布时间】:2023-03-19 15:56:01
【问题描述】:

下面是我的 Hex 到 ASCII 转换方法

-(NSString*)getASCIIString:(NSString*)strHex
{
    NSMutableString *strAscii = [NSMutableString string];
    for (int i=0;i<24;i+=2) {
        NSString *charValue = [strHex substringWithRange:NSMakeRange(i,2)];
        unsigned int _byte;
        [[NSScanner scannerWithString:charValue] scanHexInt: &_byte];
        if (_byte >= 32 && _byte < 127) {
            [strAscii appendFormat:@"%c", _byte];
        } else {
            [strAscii appendFormat:@"[%d]", _byte];
        }
    }
    NSLog(@"Hex: %@", strHex);
    NSLog(@"Ascii: %@", strAscii);
    return strAscii;
}

上述方法将十六进制字符串转换为 ASCII,但我注意到一种情况给我错误的结果如下:

strHex:4E4932313533000000000066 ASCII:NI2153[0][0][0][0][0]f(错误)

为什么 00 我得到 [0]。 ?

我的方法工作得很好,只有当我提到的十六进制字符串中有 00 时,我在 Ascii 字符串中得到 [0]。

请告诉我经过测试的完美转换方法。

【问题讨论】:

  • 也许this 是你要找的?
  • 不,我的方法工作得很好,只有当我提到的十六进制字符串中有 00 时,我在 Ascii 字符串中得到 [0]。它不应该是....
  • 根据您的代码,输出是正确的,因为零字节(十六进制 0x0) 是不可打印字符,不在 32 .. 127 范围内。不要将其与 字母 0,即十六进制0x30

标签: ios objective-c


【解决方案1】:

如果十六进制字符串是00,则您在_byte 中获得值0,因此您在else 分支中,并获得[0] 作为[strAscii appendFormat:@"[%d]", _byte]; 的结果。

【讨论】:

  • 是的,我知道,但这是正确的方法吗……我想要解决方案……如果有人处理过这种情况……
  • 你需要什么结果?
  • 我真的不知道...我需要标准方式...刚才我在谷歌上查了一下...00意思是NUL...这是正确的处理方式..我错过了有些东西...
  • 或许,您可以在 else 分支前面添加一个分支 else if(_byte == 0) { [strASCII appendString:@"NUL"]; }
猜你喜欢
  • 1970-01-01
  • 2011-10-26
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
相关资源
最近更新 更多