从整数

问题描述:

我的整数,具有2的值的NSData字节的I追加一条与一个NSMutableData对象:从整数

[data appendBytes:&intVal length:2]; 

数2是予从INT想要的字节数。当我记录数据时,我想看到的是< 0002>(一个空字节后跟一个非空字节),但我得到的是< 0200>。

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

感谢您的帮助。

+2

您是否知道sizeof(int)可能与2不同? – 2013-02-13 22:20:00

+1

尝试挖掘_low-endian_,_big-endian_表示之间的差异,也许它会帮助你。 – holex 2013-02-13 22:40:15

+0

sizeof(int)在这种情况下绝对大于2(它是4)。然而,我使用的API要求数据包的这个特定部分只有2个字节长。 – btomw 2013-02-14 14:39:13

我错过了什么吗?

是的,你的系统的字节序不符合你的需要。将其转换为小端或大端(POSIX C库在<netinet.h><inet.h>标头中的某个位置具有此功能)。

+1

+1。这个。 OP期待Big Endian,其中最重要的字节在前(00000000 00000010),但获得Little Endian,最低有效字节在前(00000010 00000000)。另外,我不知道使用'int'是否是一个好主意,它可能会大于2个字节。 – Metabble 2013-02-13 23:48:14

+0

这实际上是有道理的。这就是我的脑子屁。谢谢你们让我回到正轨。 – btomw 2013-02-14 14:46:30

+0

@btomw不客气。 – 2013-02-14 14:46:52

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

下面是答案,它很好用!

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);