Objective C 中的 Get Big Endian 函数是什么样的?
What would be the Get Big Endian function looks like in Objective C?
我刚刚浏览了其中一个 Java 代码,其中他们使用了 getBigEndian 函数的代码之一来达到给定的长度。下面是 JAVA:
的代码
// JAVA
public static byte[] getBigEndian32(int length) {
byte[] res = new byte[4];
res[0] = (byte) (length >>> 24);
res[1] = (byte) ((length >>> 16) & 0xFF);
res[2] = (byte) ((length >>> 8) & 0xFF);
res[3] = (byte) (length & 0xFF);
return res;
}
这个函数在 Objective C 中会是什么样子?我尝试了以下解决方案,但没有给我上述函数返回的确切输出。
// Tried Solution 1:
NSMutableData *data = [NSMutableData data];
[data appendBytes:(const void *)(length >> 24) length:4];
[data appendBytes:(const void *)(length >> 16 & 0xFF) length:4];
[data appendBytes:(const void *)(length >> 8 & 0xFF) length:4];
[data appendBytes:(const void *)(length & 0xFF) length:4];
以上代码在第 2 行崩溃。没有有用的日志:(
// Tried Solution 2:
int convert(int num)
{
int b0,b1,b2,b3;
b0= (num & 0x000000FF)>>0;
b1= (num & 0x0000FF00)>>8;
b2= (num & 0x00FF0000)>>16;
b3= (num & 0xFF000000)>>24;
num= (b0<<24) | (b1<<16) | (b2<<8) | (b3<<0) ;
return num;
}
以上解决方案来自:
Convert Little Endian to Big Endian
也经历了Bit conversion tool in Objective-C。这也没有帮助。
让我对如何将此 Java 代码转换为 Objective C 代码有任何提示或想法。提前致谢。
您的代码未转换为 Bigendian 字节顺序。它交换字节。所以它会将 Bigendian 转换为 LittleEndian,反之亦然,这意味着它在 Bigendian 处理器上是完全错误的。
CFSwapInt32HostToBig 可以满足您的需求:将数字转换为 BigEndian 格式。不管你的处理器是什么。 htnl() 以更可移植的方式做同样的事情,只不过它表示 "host to network byte order",并且网络字节顺序是 Bigendian。然后您可以将该数字添加到 NSData。
我刚刚浏览了其中一个 Java 代码,其中他们使用了 getBigEndian 函数的代码之一来达到给定的长度。下面是 JAVA:
的代码// JAVA
public static byte[] getBigEndian32(int length) {
byte[] res = new byte[4];
res[0] = (byte) (length >>> 24);
res[1] = (byte) ((length >>> 16) & 0xFF);
res[2] = (byte) ((length >>> 8) & 0xFF);
res[3] = (byte) (length & 0xFF);
return res;
}
这个函数在 Objective C 中会是什么样子?我尝试了以下解决方案,但没有给我上述函数返回的确切输出。
// Tried Solution 1:
NSMutableData *data = [NSMutableData data];
[data appendBytes:(const void *)(length >> 24) length:4];
[data appendBytes:(const void *)(length >> 16 & 0xFF) length:4];
[data appendBytes:(const void *)(length >> 8 & 0xFF) length:4];
[data appendBytes:(const void *)(length & 0xFF) length:4];
以上代码在第 2 行崩溃。没有有用的日志:(
// Tried Solution 2:
int convert(int num)
{
int b0,b1,b2,b3;
b0= (num & 0x000000FF)>>0;
b1= (num & 0x0000FF00)>>8;
b2= (num & 0x00FF0000)>>16;
b3= (num & 0xFF000000)>>24;
num= (b0<<24) | (b1<<16) | (b2<<8) | (b3<<0) ;
return num;
}
以上解决方案来自: Convert Little Endian to Big Endian
也经历了Bit conversion tool in Objective-C。这也没有帮助。
让我对如何将此 Java 代码转换为 Objective C 代码有任何提示或想法。提前致谢。
您的代码未转换为 Bigendian 字节顺序。它交换字节。所以它会将 Bigendian 转换为 LittleEndian,反之亦然,这意味着它在 Bigendian 处理器上是完全错误的。
CFSwapInt32HostToBig 可以满足您的需求:将数字转换为 BigEndian 格式。不管你的处理器是什么。 htnl() 以更可移植的方式做同样的事情,只不过它表示 "host to network byte order",并且网络字节顺序是 Bigendian。然后您可以将该数字添加到 NSData。