【问题标题】:Byte array in objective c with ascii encoding使用 ascii 编码的目标 c 中的字节数组
【发布时间】:2013-11-17 14:31:26
【问题描述】:

我正在尝试使用 ascii 编码从目标 c 中的 NSString 获取字节数组。我需要这个数组来计算该字符串的 SHA256 哈希,然后将结果与 Windows 中生成的 SHA256 编码进行比较。

    NSString *myString = @"123456¥";
const char *string = (const unsigned char *) [myString cStringUsingEncoding:NSASCIIStringEncodin];

这总是给出nil,因为它包含¥ 字符。

问题是我不能使用 UTF8Encoding,因为 windows 生成的哈希使用 ASCII 编码,如下所示:

string text ="123456¥";
byte[] arrSHA = System.Text.Encoding.ASCII.GetBytes(text);

虽然在目标 c 中使用 UTF8 编码确实有效,但我不能使用它,因为它会提供与 .Net 中生成的字节数组不同的字节数组,这将导致该字符串的 SHA 完全不同。

关于如何进行这项工作的任何建议?

更新:

阅读有关ASCII encoding in .Net 的文档似乎它将每个非ASCII 字符转换为?。我可以在目标c中检测到这些字符并手动将它们替换为?

问候

【问题讨论】:

  • 您的字符串不是 ASCII,请找出 Windows 中使用的确切编码。也许是UTF16。也可以试试NSMacOSRomanStringEncoding,它处理完整的 256 个字符。
  • 我知道它不是 ASCII,这就是它让我痛苦的原因。然而,在 Windows 中使用 ASCII 编码将其转换为字节是可行的,所以我想知道是否有人知道如果字符串不是 ASCII,.net 是否以某种方式默认为不同的编码
  • 那么,问题是 Windows 正在对非 ASCII 字符串进行 ASCII 转换?修复 Windows 端以使用可以正确处理非 ASCII 字符串的编码。在 Windows 上打印转换后的数据,以了解 Windows 实际在做什么。在您的问题中发布。
  • 问题是我无法修复 Windows 端,损坏已经造成,所有哈希值都以 ASCII 编码保存在服务器上。
  • 至于 allowLossyConversion 很遗憾它不起作用,它将 UTF8 字符转换为最近的 ASCII 字符。例如 ¥ 转换为 Y。如果您阅读我的更新,我想我需要将字符串中的任何 UTF8 字符转换为 ?

标签: c# objective-c encoding utf-8 sha


【解决方案1】:

如果服务器使用 UTF-8 而不是 ASCII 编码,最好的解决方案是。 如果这不是一个选项,您可以使用以下代码进行转换, 其中所有非 ASCII 字符都用问号代替 (为简洁起见省略了错误检查):

NSString *myString = @"ä123€456¥";

CFIndex asciiLength;
// Determine length of converted data:
CFStringGetBytes((__bridge CFStringRef)(myString), CFRangeMake(0, [myString length]),
                 kCFStringEncodingASCII, '?', false, NULL, 0, &asciiLength);
// Allocate buffer:
uint8_t *asciiBuffer = malloc(asciiLength);
// Do the conversion:
CFStringGetBytes((__bridge CFStringRef)(myString), CFRangeMake(0, [myString length]),
                 kCFStringEncodingASCII, '?', false, asciiBuffer, asciiLength, NULL);

// Check the result:
printf("%.*s\n", (int)asciiLength, asciiBuffer);
// Output: ?123?456?

(据我所知)没有等效的 NSString 方法,因此您有 使用从NSStringCFStringRef 的“免费桥”和核心基金会 函数。

【讨论】:

  • 它对我不起作用,由于某种原因,asciiBuffer 在调用最后一个 CFStringGetBytes 后只有一个字节,无论我输入什么字符串,它总是一样的。 asciiLength 有正确的字符串长度顺便说一句
  • @RedSerpent:这很奇怪。我已经用你的输入 @"123456¥" 和其他字符串测试了代码,它总是产生预期的结果。
  • 不知何故它对我不起作用,是的,打印结果只会给出第一个字符。
  • 你输入的字符串是什么? asciiLength 的值是多少? CFStringGetBytes()的返回值是多少?
  • 我的输入字符串是“123456¥”' asciiLength = 7的值,输出只是“1”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 2019-01-22
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
相关资源
最近更新 更多