【问题标题】:Parsing NSData by byte count按字节数解析 NSData
【发布时间】:2012-12-09 02:07:04
【问题描述】:

我有 NSData,我想按字节解析它。这是一个例子。 data is <8283010c ec4f483f 0d00000c 0c0f2840 >

我想将 8 个字节传递给我创建的每个对象 (8283010c ec4f483f for first object,0d00000c 0c0f2840 for the second) ,然后像这样解析每个字节。

  //  First byte > Action = 82
  //  2nd and 3rd byte > Status = 83 01
  //  4,5,6,7 byte > Time = 0c ec 4f48
  //  8 byte > Number = 3f

我如何将 NSData 解析为这样的结构,我应该为我的变量(动作)使用什么类型?

unsigned char aBuffer[8];
[data getBytes:aBuffer length:8];

试图以这种方式进行小测试,但是 NSLog 打印出带有奇怪符号的缓冲区,而不是字节值。

【问题讨论】:

  • 好吧,“解析”是什么意思?在这种情况下,它并不完全有意义。你为什么不直接从[data bytes] + offset * 8复制8个字节呢?
  • 数据使用什么编码?它可能返回 4 个 unichar 字符而不是 8 个 ASCII 字符。您还应该告诉我们结构的定义,您提供的那个不清楚。
  • 数据没有编码。是原始数据。如果我能以某种方式将这些数据转换为像 NSString 一样,那就太好了。 H2CO3 你能写一个关于如何做到这一点的简单例子,或者指出我在哪里可以学到这个。因为目前这对我来说是一片黑暗的森林,没有光。
  • @Datenshi 你用过printf()吗?如果没有,您是否尝试过阅读和理解NSData 的文档?我不这么认为......
  • 是的,我都试过了,你的评论让我觉得有点愚蠢。您的回答确实对我有所帮助,这正是我所要求的,谢谢您的宝贵时间。很抱歉自己不够聪明,无法在没有帮助的情况下掌握一切:)

标签: objective-c hex nsdata


【解决方案1】:

NSLog 打印带有奇怪符号的缓冲区,而不是字节值。

因为这些是实际字节 NSData 包含,而不是它们的十六进制表示。如果您想要十六进制表示,则必须相应地格式化字节:

NSMutableString *hexRepr = [NSMutableString string];
for (int i = 0; i < 8; i++) {
    [hexRepr appendFormat:@"%02x", ((uint8_t *)[data bytes])[offset * 8 + i]];
}

【讨论】:

    【解决方案2】:

    作为@H2CO3 回答的后续,

    根据NSData docs[data description] 返回十六进制表示。那不是更容易吗?

    更新:找到不应该使用[data description] 的原因:https://stackoverflow.com/a/9084784/58505

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 2012-05-28
      相关资源
      最近更新 更多