【问题标题】:NSData bytes from integer来自整数的 NSData 字节
【发布时间】:2013-12-10 23:05:00
【问题描述】:

我有一个整数,值为 2。我将它附加到一个 NSMutableData 对象:

[data appendBytes:&intVal length:2];

数字 2 是我想要的 int 字节数。当我记录数据时,我想看到的是 (一个空字节后跟一个非空字节),但我得到的是 。

我错过了什么吗?字节的顺序和长度需要非常具体。这是用于直接套接字连接 API。我不确定我在这里做错了什么。也许我只是读错了。

感谢您的帮助。

【问题讨论】:

  • 您知道 sizeof(int) 可能与 2 不同吗?
  • 尝试挖掘自己在 low-endianbig-endian 表示之间的区别,也许它会对你有所帮助。
  • sizeof(int) 在这种情况下肯定大于 2(它是 4)。但是,我使用的 api 要求数据包的这个特定部分只有 2 个字节长。

标签: objective-c nsdata nsmutabledata


【解决方案1】:

我错过了什么吗?

是的,您系统的字节序不符合您的需要。将其转换为小端或大端(POSIX C 库在 <netinet.h><inet.h> 标头中的某处为此提供了函数)。

【讨论】:

  • +1。这个。 OP 期待 Big Endian,最高有效字节在前(00000000 00000010),但得到 Little Endian,最低有效字节在前(00000010 00000000)。另外,我不知道使用 int 是否是个好主意,它可能大于 2 个字节。
  • 这是有道理的,实际上。那是我的大脑放屁。谢谢你们让我回到正轨。
【解决方案2】:

NSData 的描述方法以十六进制格式打印它的值。这意味着它需要 4 位数字来表示 2 个字节,每个字节可能映射 2^8=256 个不同的值,每个十六进制数字可能映射 16 个可能的值,所以 16x16x16x16 = 2^16,这正是你可以用 2 个字节映射的值.

【讨论】:

    【解决方案3】:

    这是答案,效果很好!

    uint16_t intVal = 2;
    Byte *byteData = (Byte*)malloc(2);
    byteData[1] = majorValue & 0xff;
    byteData[0] = (majorValue & 0xff00) >> 8;
    NSData * result = [NSData dataWithBytes:byteData length:sizeof(uint16_t)];
    NSLog(@"result=%@",result);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      相关资源
      最近更新 更多