Objective C 中的 Get Big Endian 函数是啥样的? [关闭]

Posted

技术标签:

【中文标题】Objective C 中的 Get Big Endian 函数是啥样的? [关闭]【英文标题】:What would be the Get Big Endian function looks like in Objective C? [closed]Objective C 中的 Get Big Endian 函数是什么样的? [关闭] 【发布时间】:2016-07-20 06:41:07 【问题描述】:

我刚刚浏览了一段 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];

上面的代码在第二行崩溃了。没有有用的日志:(

// 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 代码有任何提示或想法。提前致谢。

【问题讨论】:

您要解决什么问题?已经有各种功能可以做到这一点。这只是一个学习练习吗? 解决方案 #2 有什么问题?还有CFSwapInt32HostToBig()htonl() 用于相同目的。 @MartinR 至少使用#2,因为 AND 是第一个并且变量已签名,符号将在最后一个扩展。应该先换班,最后换班。在原来的 SO 答案中,变量是无符号的,所以它工作正常。 @SamiKuhmonen:如果我没记错的话,实际上右移有符号整数是实现定义。但这就是为什么我要问 OP:他对代码有什么问题? @DShah:见***.com/questions/20053976/… 或***.com/questions/4931492/…。 【参考方案1】:

您的代码不会转换为 Bigendian 字节顺序。它交换字节。所以它将 Bigendian 转换为 LittleEndian,反之亦然,这意味着在 Bigendian 处理器上它是完全错误的。

CFSwapInt32HostToBig 完全满足您的需求:将数字转换为 BigEndian 格式。不管你的处理器是什么。 htnl() 以更便携的方式做同样的事情,除了它的意思是“主机到网络字节顺序”,而网络字节顺序是 Bigendian。然后您可以将该数字添加到 NSData。

【讨论】:

以上是关于Objective C 中的 Get Big Endian 函数是啥样的? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

TypeError: date[("get" + method)] 不是 React-big-calendar 中的函数

TypeError:date [(“ get” +方法)]不是React-big-calendar中的函数

C# 是像 Objective-C 和 C++ 一样的 C 超集吗?

C中的静态函数

块、范围和设置变量 Objective C

Objective C - 循环后删除/隐藏 NSProgressIndicator