1

我从网络服务中得到这个十六进制

http://www.moodpin.it/cms/listar_avatar?id=9

并尝试转换为 NSData 并设置 UIImageView 但它不起作用

这是我的代码:

NSData *dataImage =  [appDelegate hexStringToData:avatar.avatar];
[imageView setImage:[UIImage imageWithData:dataImage]];

 - (NSData *) hexStringToData:(NSString *) aString
               {
NSString *command = aString;
command = [command stringByReplacingOccurrencesOfString:@" " withString:@""];
NSMutableData *commandToSend= [[NSMutableData alloc] init];
unsigned char whole_byte;
char byte_chars[3] = {'\0','\0','\0'};
int i;
for (i=0; i < [command length]/2; i++) {
    byte_chars[0] = [command characterAtIndex:i*2];
    byte_chars[1] = [command characterAtIndex:i*2+1];
    whole_byte = strtol(byte_chars, NULL, 16);
    [commandToSend appendBytes:&whole_byte length:1];
}
NSLog(@"%@", commandToSend);
return commandToSend;
 }
4

1 回答 1

1

for (i=0; i < 8; i++) {

“不起作用”非常模糊。我的第一印象是您只查看前 16 个字节(每次迭代两个字节),因此您显然不会获得与输入字符串对应的数据块。似乎您应该使用字符串的长度来管理for循环。此外,如果字符串包含奇数个字符,您的代码将有效地将一个0字符附加到十六进制字符串。

除了使您的代码无法工作的原因之外,您还可以考虑使用不同的转换方法。例如,您可以创建一个包含一些无效值 (-1) 的 256 个字符的查找表,除了对应于十六进制数字的字符,即 0..9、a..f 和 A​​..F。表中与这些字符对应的位置处的值将具有十六进制数字值,例如和10的索引处。这仅适用于特定的单字节字符编码,如 ASCII,但在这种情况下,这可能不是一个严重的限制。使用查找表快速找到每个十六进制数字的值,然后使用这些值作为半字节来构建字节。aA

于 2013-06-21T15:47:51.830 回答