我正在尝试将一行十六进制转换为一行char值。这是我使用的代码:
// Store HEX values in a mutable string:
NSUInteger capacity = [data length] * 2;
NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:capacity];
const unsigned char *dataBuffer = [data bytes];
NSInteger i;
for (i=0; i<[data length]; ++i) {
[stringBuffer appendFormat:@"%02X ", (NSUInteger)dataBuffer[i]];
}
// Log it:
NSLog(@"stringBuffer is %@",stringBuffer);
// Convert string from HEX to char values:
NSMutableString * newString = [[NSMutableString alloc] init];
NSScanner *scanner = [[NSScanner alloc] initWithString:content];
unsigned value;
while([scanner scanHexInt:&value]) {
[newString appendFormat:@"%c ",(char)(value & 0xFF)];
}
NSLog(@"newString is %@", newString);
到目前为止,这很有效。输出按预期收到:
String Buffer is 3D 3E 2C 01 2C 31 33 30 37 31 38 30 39 32 34 2D 30 37 2C FF 00 00 00 00 00
newString is = > , , 1 3 0 7 1 8 0 9 2 4 - 0 7 , ˇ
只有一个问题,NULL值正在终止我的字符串(我认为)。新字符串应该键入“0 0 0 0”,但它不会,它只是在那里结束。我认为它在那里结束,因为连续3个零= char中的NULL。有谁知道我怎么能阻止这个字符串终止并显示整个值?
答案 0 :(得分:1)
%c
格式不会为NULL字符生成任何输出,但也是如此
不要终止字符串。请参阅以下示例:
NSMutableString * newString = [[NSMutableString alloc] init];
[newString appendFormat:@"%c", 0x30]; // the '0' character
[newString appendFormat:@"%c", 0x00]; // the NULL character
[newString appendFormat:@"%c", 0x31]; // the '1' character
NSLog(@"newString is %@", newString);
// Output: newString is 01
NSLog(@"length is %ld", newString.length);
// Output: length is 2
所以你不能期望获得十六进制输入00
的任何输出。特别是,你不能
期望得到字符“0”,因为它具有ASCII码{16},而不是30
。
请注意,您可以使用
直接将00
转换为NSData
NSString
如果NSString *s = [[NSString alloc] initWithData:data encoding:encoding];
表示某种编码中的字符串,例如UTF-8(情况并非如此)
你的数据)。
如果您解释数据代表什么以及代表什么,可能会有更好的答案 您想要的数据的字符串表示。