我试图使用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中检测这些字符并手动将其替换为?
此致
答案 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
方法,因此你有
使用从NSString
到CFStringRef
和核心基金会的“免费电话桥”
功能