Objective c NSData编码为Unicode返回nil

Objective c NSData编码为Unicode返回nil,objective-c,ios,encoding,Objective C,Ios,Encoding,我正在尝试将HMAC(散列数据)转换为URL安全的字符串,以便进行身份验证 我在用little和big-Endian将sha256哈希(使用苹果加密库)生成的数据转换为Unicode时遇到问题,一个哈希字符串可以用big而不是little,反之亦然。对于一些散列 它工作得很好。我认为这可能与一个超出范围的角色或其他什么有关。当我说它不工作时,我的意思是它返回零 代码如下所示: NSString *mystring = [[NSString alloc] initWithData:myHash e

我正在尝试将HMAC(散列数据)转换为URL安全的字符串,以便进行身份验证

我在用little和big-Endian将sha256哈希(使用苹果加密库)生成的数据转换为Unicode时遇到问题,一个哈希字符串可以用big而不是little,反之亦然。对于一些散列 它工作得很好。我认为这可能与一个超出范围的角色或其他什么有关。当我说它不工作时,我的意思是它返回零

代码如下所示:

NSString *mystring = [[NSString alloc] initWithData:myHash encoding:NSUnicodeEncoding
void bytes_to_hexstring(void *uuid, char *hex_string, size_t osize) {
    static const char hexdigits[] = "0123456789ABCDEF";
    const unsigned char* bytes = (unsigned char *)uuid;

    int i = 0;
    for (i = 0; i<osize; ++i) {
        const unsigned char c = *bytes++;
        *hex_string++ = hexdigits[(c >> 4) & 0xF];
        *hex_string++ = hexdigits[(c ) & 0xF];
    }
    *hex_string = 0;
}

char *mystring = malloc(41);
bytes_to_hexstring(myHash, mystring, 20);

something like this.
Unicode是最好的使用方法吗?我尝试编码到UTF8,它返回nil,ascii没有所有的字符,我得到了一些数据丢失的“?”

实际上,我的问题是,如何从sha256散列中的NSData生成字符串


解决方案:


NSData+Base64.h和NSData+Base64.m

首先需要从HMAC字节中生成一个十六进制字符串。 你可以这样做:

NSString *mystring = [[NSString alloc] initWithData:myHash encoding:NSUnicodeEncoding
void bytes_to_hexstring(void *uuid, char *hex_string, size_t osize) {
    static const char hexdigits[] = "0123456789ABCDEF";
    const unsigned char* bytes = (unsigned char *)uuid;

    int i = 0;
    for (i = 0; i<osize; ++i) {
        const unsigned char c = *bytes++;
        *hex_string++ = hexdigits[(c >> 4) & 0xF];
        *hex_string++ = hexdigits[(c ) & 0xF];
    }
    *hex_string = 0;
}

char *mystring = malloc(41);
bytes_to_hexstring(myHash, mystring, 20);

something like this.
void bytes\u to\u hexstring(void*uuid,char*hex\u string,size\t osize){
静态常量字符十六进制数字[]=“0123456789ABCDEF”;
常量无符号字符*字节=(无符号字符*)uuid;
int i=0;
对于(i=0;i>4)&0xF];
*十六进制字符串++=十六进制数字[(c)和0xF];
}
*十六进制字符串=0;
}
char*mystring=malloc(41);
字节到十六进制字符串(myHash,mystring,20);
像这样的。

加密哈希的结果是没有任何编码的纯二进制数据。NSString实例也没有编码。所以所有的编码都是错误的。Jonas Schnelli的解决方案是一种方法。Base64转换将是另一种转换。@Codo您能为objective c推荐Base64编码器吗?或者可可中有内置的吗?我不能推荐一个具体的。但这提供了几个。这是一个基本的64编码吗?我需要把它设置成在另一端解码是的。它的基础是64。当您再次需要rawbytes时,可以在服务器上执行base64unencode。@JonasSchnelli:不,不是。您的答案建议使用十六进制表示法,而不是基数为64的表示法。它们是两种不同的。是的,尾波是对的。它是字符串的十六进制表示形式。但您也可以使用BAS64编码(和在服务器上解码)。看看这个。