2014-03-19 67 views
1

我有Java代码:转换长字节阵列

Long long_value = 1; 
ByteBuffer.allocate(8).putLong(long_value).array(); 

我有个字节的结果阵列:0,0,0,0,0,0,0,1(以该顺序)。

请问此代码如何正确移植到Objective C?

+0

是否要将值存储在'NSArray'中,一个普通的C数组'NSData'?请提供更多关于您想要完成的背景。 – sbooth

+0

@sbooth,我需要结果长度为8的字符(字节)数组。 –

回答

4

序言

你说 “的顺序”。当多字节值存储在内存中时,字节可以存储为big-endian - 最重要的字节在前或小端 - 最低有效字节在前。例如,2字节十六进制值0x1234存储为0x12,0x34大端和0x34,0x12小端。 endian顺序取决于正在使用的计算机体系结构,例如Intel x86是小端的。

ByteBuffer是一个Java类,它根据自己的endian标记将值存储为字节,而与底层硬件的endian顺序无关。默认设置ByteBuffer是big-endian。在你的示例中,你不要设置这个标志,你显示的数组是以大端顺序排列的。

Apple提供Byte Order Utilities Reference中描述的用于操纵端序的功能。你需要的函数是CFSwapInt64HostToBig,它需要一个64位有符号或无符号的int,以主机使用的任何endian顺序,并返回一个整数,字节按big-endian顺序排列 - 数值结果的值在这个上是毫无意义的点,它是一个有8个字节的有序集合。

你也说你想要8个字节,但是long可能不是8个字节 - 这取决于硬件架构,语言和编译器。例如,对于OS X,编译64位时它们为8个字节。有两种方法可以解决这个问题,你可以使用标准函数sizeof返回一个值或一个类型的字节数,你可以给它传递一个变量或一个类型名称;也可以在需要特定字节数时使用预定义的大小类型,例如SInt64是预定义的8字节带符号整数类型。

最后你说你想要一个“数组”,但是什么样的数组? Objective-C/Cocoa有两个:C语言值数组,以及Objective-C对象数组及其可变同级NSMutableArray

C语言数组:在C中,数组变量的名称的类型是“指向元素类型的指针”,例如,对于声明float values[8]values的类型是float *。这意味着指针可以用作数组,但它们是而不是同样的事情 - 指针变量包含指向内存的指针,但不分配内存指向,数组声明为其元素分配内存。

C中的数组

如何获得在大端序字节C “阵列”:

SInt64 long_value = 0x123456789ABCDEF;    // use SInt64 rather than long 
UInt64 BE_value = CFSwapInt64HostToBig(long_value); // use UInt64 as this value may not make numeric sense any more 
UInt8 *BE_ptr = (UInt8 *)&BE_value;     // UInt8 is a byte, take the address of BE_value 

// BE_ptr is now a pointer to the 8 bytes of memory occupied by BE_value 
// it can be treated as an array 
// print it out to demo 
for (int ix = 0; ix < 8; ix++) 
{ 
    NSLog(@"%d: %2x", ix, BE_ptr[ix]); 
} 

这将打印出1234等。

Objective-C的阵列

可以在上述构建此。你不能在一个Objective-C的对象直接存储字节,则必须把它包起来作为使用NSNumber对象,并@()是一个速记做到这一点:

SInt64 long_value = CFSwapInt64HostToBig(0x123456789ABCDEF); 
UInt8 *BE_ptr = (UInt8 *)& long_value; 

NSMutableArray *BE_array = [NSMutableArray arrayWithCapacity:8]; // create an object array 
for (int ix = 0; ix < sizeof(long); ix++) 
{ 
    [BE_array addObject:@(BE_ptr[ix])]; // @(...) creates an NSNumber 
} 
NSLog(@"array: %@", BE_array); 

这将打印出数组(以十进制)。

HTH

0

您可以使用char指针(chars与字节的大小通常相同)。

unsigned char *p = (unsigned char *)&myLong; 

char byte1 = p[0]; 
char byte2 = p[1]; 
//etc...