【问题标题】:NULL Values Keep Terminating My NSStringNULL 值不断终止我的 NSString
【发布时间】:2013-07-17 15:59:45
【问题描述】:

我正在尝试将一行十六进制转换为一行字符值。这是我使用的代码:

// 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。有谁知道如何防止这个字符串终止并显示整个值?

【问题讨论】:

    标签: objective-c char hex data-conversion


    【解决方案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 码十六进制 30,而不是 00

    请注意,您可以直接使用将NSData 转换为NSString

    NSString *s = [[NSString alloc] initWithData:data encoding:encoding];
    

    如果data 表示某种编码的字符串,例如UTF-8(情况并非如此 您的数据)。

    如果您解释数据代表什么以及什么 您想要的数据的字符串表示形式。

    【讨论】:

    • 我明白了。当我检查输出时,字符串没有终止。 00 由空格表示。你就是马丁,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多