【问题标题】:How to print unsigned char* in NSLog()如何在 NSLog() 中打印 unsigned char*
【发布时间】:2012-11-11 10:58:34
【问题描述】:

标题几乎说明了一切。

想要打印(不是十进制),而是无符号字符值(十六进制)。 例子

unsigned char data[6] = {70,AF,80,1A, 01,7E};
NSLog(@"?",data); //need this output : 70 AF 80 1A 01 7E

有什么想法吗?提前致谢。

【问题讨论】:

标签: objective-c c char unsigned nslog


【解决方案1】:

char 数组没有格式说明符。一种选择是从数组创建一个NSData 对象,然后记录NSData 对象。

NSData *dataData = [NSData dataWithBytes:data length:sizeof(data)];
NSLog(@"data = %@", dataData);

【讨论】:

  • 嗯,char 数组有一个格式说明符——s——但它需要一个以 null 结尾的字符串并打印为 ASCII 字符,而不是十六进制。
  • @HotLicks 这就是我没有提到%s 的原因,因为我们不处理以空结尾的char 数组,并且所需的输出与%s 提供的完全不同。
  • 主题外,但如何只打印无符号字符?不是数组。
  • %c 用于无符号字符。提取NSString stringWithFormat: 的文档。然后单击“字符串格式说明符”的链接。但是 %c 将打印字符,而不是十六进制值。
  • 如果要打印十六进制,使用%x是吗?
【解决方案2】:

标准库中没有任何东西可以做到这一点,因此您可以编写一个小的十六进制转储函数,或者您可以使用其他东西来打印无歧义的完整数据。比如:

char buf[1 + 3*dataLength];
strvisx(buf, data, dataLength, VIS_WHITE|VIS_HTTPSTYLE);
NSLog(@"data=%s", buf);

对于较小的数据块,您可以尝试创建一个 NSData 并使用 debugDescription 方法。目前这是一个十六进制转储,但没有任何保证它会永远是一个。

【讨论】:

  • VIS_WHITE 未声明。包括什么?
【解决方案3】:

要在 NSLog 中打印 char*,请尝试以下操作:

char data[6] = {'H','E','L','L','0','\n'};
NSString *string = [[NSString alloc] initWithUTF8String:data];
NSLog(@"%@", string);

您需要null 终止您的字符串。

来自 Apple 文档:

- (instancetype)initWithUTF8String:(const char *)nullTerminatedCString;

返回一个 NSString 对象,该对象通过从给定的 UTF8 编码字节 C 数组中复制字符来初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2011-09-15
    相关资源
    最近更新 更多