1
loveuqian 2015-12-13 17:57:32 +08:00 via iPhone
你是怎么把 data 存到 str 里面的
|
2
dorentus 2015-12-13 17:57:36 +08:00 via iPhone
搜 hex to nsdata
|
3
aaronlam OP @loveuqian T T 直接把 NSData 类型的放进了 stringWithFormat 后,悲剧就这么发生了!
具体情况是这样的在我服务器端 Mysql 数据库里有个字段是用来存头像的(字段类型: MediumBlod ),然后我在 APP 端提供上传图片通过 JSON 存到 Mysql 数据库中,然后我想再次通过 JSON 从数据库拿回图片来显示的时候,发现通过 NSJSONSerialization 后的 NSData 变成了 NSString 类型(也就是说 NSString 里存着 NSData 的十六进制数据) |
4
allenforrest 2015-12-14 12:29:01 +08:00 1
```
- (NSData *)dataFromHexString { const char *chars = [self UTF8String]; NSUInteger i = 0, len = self.length; NSMutableData *data = [NSMutableData dataWithCapacity:len / 2]; char byteChars[3] = {'\0','\0','\0'}; unsigned long wholeByte; while (i < len) { byteChars[0] = chars[i++]; byteChars[1] = chars[i++]; wholeByte = strtoul(byteChars, NULL, 16); [data appendBytes:&wholeByte length:1]; } return data; } ``` 拿走不谢。 |
5
aaronlam OP +(NSData*)hexStringToByte:(NSString*)hexString
{ hexString=[[hexString uppercaseString] stringByReplacingOccurrencesOfString:@" " withString:@""]; if ([hexString length]%2!=0) { return nil; } Byte tmpByt[1]={0}; NSMutableData* bytes=[NSMutableData data]; for(int i = 0; i < [hexString length]; i++) { unichar hex_char1 = [hexString characterAtIndex:i]; //两位 16 进制数中的第一位(高位*16 ) int int_ch1; if(hex_char1 >= '0' && hex_char1 <='9') int_ch1 = (hex_char1-48)*16; //0 的 Ascll - 48 else if(hex_char1 >= 'A' && hex_char1 <='F') int_ch1 = (hex_char1-55)*16; //A 的 Ascll - 65 else return nil; i++; unichar hex_char2 = [hexString characterAtIndex:i]; //两位 16 进制数中的第二位(低位) int int_ch2; if(hex_char2 >= '0' && hex_char2 <='9') int_ch2 = (hex_char2-48); //0 的 Ascll - 48 else if(hex_char2 >= 'A' && hex_char2 <='F') int_ch2 = hex_char2-55; //A 的 Ascll - 65 else return nil; tmpByt[0] = int_ch1+int_ch2; ///将转化后的数放入 Byte 数组里 [bytes appendBytes:tmpByt length:1]; } return bytes; } 已解决! |
6
aaronlam OP |