具有ascii编码的目标c中的字节数组

时间:2013-11-17 14:31:26

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

我试图使用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完全不同。

有关如何使这项工作的任何建议?

UPDATE:

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

此致

1 个答案:

答案 0 :(得分: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和核心基金会的“免费电话桥” 功能