【问题标题】:Convert ASCII String into NSData将 ASCII 字符串转换为 NSData
【发布时间】:2015-11-03 11:43:07
【问题描述】:

我有一组 ASCII 字符串。它有一些 ASCII 字符:

t¹¢Ðèm¯¼®Û­=~

我这样做是为了将其转换为 NSData:

NSMutableData *inputData = [[inputString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES] mutableCopy];

但它会返回这个:

74c292c2 b9c2a2c3 90c3a86d c2af1dc2 bcc2aec3 9bc2adc2 9e3d

翻译后发现不一样,结果如下:

t’¹¢Ðèm¯¼®Û­ž=

如何正确读取此 ASCII 字符串并将其放入 NSData 实例中。

【问题讨论】:

  • 显示您正在使用的代码。这个问题有可疑的支持;考虑到它的质量。
  • 这也与前几天同一用户提出的另一个问题非常相似:stackoverflow.com/questions/33474856/…
  • 那是一个不同的,我已经得到了那个,这是一个不同的问题我已经解决了,这个略有不同但仍然是 ASCII
  • 源字符串不是 ASCII。 ASCII 是 7`bit 编码,你的字符串明显包含非 ASCII 字符。
  • @Willeke 它不称为“8 位 ASCII”。您指的是各种字符编码,例如 ISO-8859-1。该编码将仅涵盖拉丁字符集;最好使用 UTF-8。

标签: objective-c nsstring ascii aes nsdata


【解决方案1】:

试试这个。

NSString *inputString = @"t¹¢Ðèm¯¼®Û­=~";
NSMutableData *inputData = [[inputString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES] mutableCopy];
NSString *retStr = [NSString stringWithUTF8String:[inputData bytes]];
//NSLog(@"retStr:%@",retStr);

结果:t¹¢Ðèm¯¼®Û=~

【讨论】:

  • 这不是一个 ASCII 字符串,所以我怀疑它会起作用。
  • 我得到了这个:74123163 5448656d 1d312f34 28522955 2d1e3d,当我翻译时返回这个:t1cTHem1/4(R)U-=
  • 这是非常危险且未定义的行为。 inputData 不是以 NULL 结尾的,这是 stringWithUTF8String: 所要求的。
  • 我在 Xcode 7.0 beta 中得到这个“t¹¢​​Ðèm¯¼®Û=~”结果
  • 这是一种方式(也是我推荐的方式),或者您可以使用initWithBytes:length:encoding:。但是dataWithEncoding:allowLossyConversion: 不会以 NULL 结尾,因此您需要以某种方式传递长度。
【解决方案2】:

首先,您对“ASCII”的含义感到困惑。您提供的字符串不能是 ASCII。该字符串中的大多数字符都无法用 ASCII 编码。您的代码建议您使用“ASCII”来表示“UTF-8”,这是一种不同的编码。

您提供的十六进制输出包含您未显示的控制字符。例如,第二个字符是 c2 92, PRIVATE USE TWO,它没有官方定义,经常被渲染为不可见(虽然我看到它在某些地方显示为)。

您最后给出的字符串看起来像是对数据的 Mac OS 罗马字符串解码。你没有说明你是如何得到这个字符串的,但你正在使用另一种编码。

关键是您必须在整个系统中使用一致的编码。如果您使用 UTF-8,则必须在任何地方使用它。如果您使用的是 ASCII(几乎没有理由再使用它),那么许多字符将无法编码。

【讨论】:

    【解决方案3】:

    我做了一些试验和错误,发现字符串不是 ASCII 字符串。它是一个 ISO Latin 1 编码字符串。所以这样做可以解决我的问题:

    NSString *inputString = @"t¹¢Ðèm¯¼®Û­=~";
    NSMutableData *data = [[inputString dataUsingEncoding:NSISOLatin1StringEncoding] mutableCopy];
    

    我翻译数据后的结果:t¹¢Ðèm¯¼®Û­=~

    【讨论】:

    • UTF-8 字符串编码的工作方式与我预期的略有不同。
    猜你喜欢
    • 2019-02-15
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    相关资源
    最近更新 更多