将NSData字节数组转换为字符串?

qua*_*ato 9 cocoa json objective-c nsdata

我有一个NSData对象.我需要将其字节转换为字符串并作为JSON发送.description返回十六进制并且不可靠(根据各种SO海报).所以我正在看这样的代码:

NSUInteger len = [imageData length];
Byte *byteData = (Byte*)malloc(len);
[imageData getBytes:&byteData length:len];
Run Code Online (Sandbox Code Playgroud)

然后我如何将byteData作为JSON发送?我想发送原始字节.

码:

NSString *jsonBase64 = [imageData base64EncodedString];
NSLog(@"BASE 64 FINGERPRINT: %@", jsonBase64);
NSData *b64 = [NSData dataFromBase64String:jsonBase64];
NSLog(@"Equal: %d", [imageData isEqualToData:b64]);
NSLog(@"b64: %@", b64);
NSLog(@"original: %@", imageData);
NSString *decoded = [[NSString alloc] initWithData:b64 encoding:NSUTF8StringEncoding];
NSLog(@"decoded: %@", decoded);
Run Code Online (Sandbox Code Playgroud)

除了最后一行之外,我得到了一切的价值 - decoded.哪会告诉我原始字节没有格式化为NSUTF8encoding?

rob*_*180 6

你尝试过这样的东西:

@implementation NSData (Base64)
- (NSString *)base64EncodedString
{
    return [self base64EncodedStringWithWrapWidth:0];
}
Run Code Online (Sandbox Code Playgroud)

这会将您的NSData转换为base64字符串,而另一方面您只需解码它.

编辑:@Lucas说你可以这样做:

NSString *myString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

但由于一些特殊的字符,我对这个方法有一些问题,因此我开始使用base64字符串进行通信.

EDIT3:尝试这种方法 base64EncodedString

    @implementation NSData (Base64)

    - (NSString *)base64EncodedString
    {
        return [self base64EncodedStringWithWrapWidth:0];
    }

    //Helper Method
    - (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth
    {
        //ensure wrapWidth is a multiple of 4
        wrapWidth = (wrapWidth / 4) * 4;

        const char lookup[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

        long long inputLength = [self length];
        const unsigned char *inputBytes = [self bytes];

        long long maxOutputLength = (inputLength / 3 + 1) * 4;
        maxOutputLength += wrapWidth? (maxOutputLength / wrapWidth) * 2: 0;
        unsigned char *outputBytes = (unsigned char *)malloc((NSUInteger)maxOutputLength);

        long long i;
        long long outputLength = 0;
        for (i = 0; i < inputLength - 2; i += 3)
        {
            outputBytes[outputLength++] = lookup[(inputBytes[i] & 0xFC) >> 2];
            outputBytes[outputLength++] = lookup[((inputBytes[i] & 0x03) << 4) | ((inputBytes[i + 1] & 0xF0) >> 4)];
            outputBytes[outputLength++] = lookup[((inputBytes[i + 1] & 0x0F) << 2) | ((inputBytes[i + 2] & 0xC0) >> 6)];
            outputBytes[outputLength++] = lookup[inputBytes[i + 2] & 0x3F];

            //add line break
            if (wrapWidth && (outputLength + 2) % (wrapWidth + 2) == 0)
            {
                outputBytes[outputLength++] = '\r';
                outputBytes[outputLength++] = '\n';
            }
        }

        //handle left-over data
        if (i == inputLength - 2)
        {
            // = terminator
            outputBytes[outputLength++] = lookup[(inputBytes[i] & 0xFC) >> 2];
            outputBytes[outputLength++] = lookup[((inputBytes[i] & 0x03) << 4) | ((inputBytes[i + 1] & 0xF0) >> 4)];
            outputBytes[outputLength++] = lookup[(inputBytes[i + 1] & 0x0F) << 2];
            outputBytes[outputLength++] =   '=';
        }
        else if (i == inputLength - 1)
        {
            // == terminator
            outputBytes[outputLength++] = lookup[(inputBytes[i] & 0xFC) >> 2];
            outputBytes[outputLength++] = lookup[(inputBytes[i] & 0x03) << 4];
            outputBytes[outputLength++] = '=';
            outputBytes[outputLength++] = '=';
        }

        if (outputLength >= 4)
        {
            //truncate data to match actual output length
            outputBytes = realloc(outputBytes, (NSUInteger)outputLength);
            return [[NSString alloc] initWithBytesNoCopy:outputBytes
                                                  length:(NSUInteger)outputLength
                                                encoding:NSASCIIStringEncoding
                                            freeWhenDone:YES];
        }
        else if (outputBytes)
        {
            free(outputBytes);
        }
        return nil;
    }
Run Code Online (Sandbox Code Playgroud)


Chr*_*aze 6

  1. 之前的Stack帖子中String被认为" 不可靠 " 的原因是因为他们也试图使用NSData对象,其中结尾字节没有用NULL正确终止:

    NSString *jsonString = [NSString stringWithUTF8String:[nsDataObj bytes]];
    // This is unreliable because it may result in NULL string values
    
    Run Code Online (Sandbox Code Playgroud)
  2. 以下示例应该为您提供所需的结果,因为NSData字节字符串将正确终止:

    NSString *jsonString = [[NSString alloc]  initWithBytes:[nsDataObj bytes] length:[nsDataObj length] encoding: NSUTF8StringEncoding];
    
    Run Code Online (Sandbox Code Playgroud)

您走在正确的轨道上,希望这能够帮助您解决当前的问题.祝你好运!

〜编辑〜

确保从图像中声明NSData对象:

NSData *imageData = [[NSData alloc] init];
imageData = UIImagePNGRepresentation(yourImage);
Run Code Online (Sandbox Code Playgroud)