我从网络服务获取此十六进制
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;
}
答案 0 :(得分:1)
for (i=0; i < 8; i++) {
“不起作用”很模糊。我的第一印象是你只看到前16个字节(每次迭代两个字节),所以你显然不会得到一块与输入字符串对应的数据。好像你应该使用字符串的长度来管理for
循环。此外,如果字符串具有奇数个字符,则您的代码将有效地将0
字符附加到十六进制字符串。
除了使您的代码无法正常工作之外,您还可以考虑采用不同的转换方法。例如,您可以创建一个256个字符的查找表,该表填充了一些无效值(-1),但对应于十六进制数字的字符除外,即0..9,a..f和A..F。表格中与这些字符对应的位置的值将具有十六进制数字值,因此10
和a
的索引处为A
。这只适用于特定的单字节字符编码,如ASCII,但在这种情况下可能不是一个严重的限制。使用查找表快速查找每个十六进制数字的值,然后使用这些值作为半字节来构建字节。