java - 将 Little Endian 转换为 Big Endian

标签 java portability

全部,

我一直在网上练习编码问题。目前我正在处理一个问题陈述 Problems,我们需要转换 Big Endian <-> little endian。但是考虑到给出的示例,我无法记下步骤:

123456789 converts to 365779719

我考虑的逻辑是:
1> 获取整数值(因为我是Windows x86,所以输入是Little endian)
2 > 生成相同的十六进制表示。
3> 反转表示,生成大端整数值

但我显然在这里遗漏了一些东西。

谁能指导我。我正在使用 Java 1.5 编写代码

最佳答案

由于编写软件的很大一部分是关于重用现有解决方案,因此首先应该始终查看您的语言/库的文档。

reverse = Integer.reverseBytes(x);

我不知道这个函数的效率如何,但是对于切换大量数字,ByteBuffer应该提供不错的性能。

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

...

int[] myArray = aFountOfIntegers();
ByteBuffer buffer = ByteBuffer.allocate(myArray.length*Integer.BYTES);

buffer.order(ByteOrder.LITTLE_ENDIAN);
for (int x:myArray) buffer.putInt(x);

buffer.order(ByteOrder.BIG_ENDIAN);
buffer.rewind();
int i=0;
for (int x:myArray) myArray[i++] = buffer.getInt(x);

正如 eversor 在评论中指出的那样,ByteBuffer.putInt()是可选方法,可能并非在所有 Java 实现中都可用。

DIY 方法

Stacker 的回答非常简洁,但可以对其进行改进。

   reversed = (i&0xff)<<24 | (i&0xff00)<<8 | (i&0xff0000)>>8 | (i>>24)&0xff;

我们可以通过调整位掩码来去掉括号。例如,(a & 0xFF)<<8相当于a<<8 & 0xFF00 .无论如何,最右边的括号是不必要的。

   reversed = i<<24 & 0xff000000 | i<<8 & 0xff0000 | i>>8 & 0xff00 | i>>24 & 0xff;

由于左移是移零位,所以第一个掩码是多余的。我们可以使用逻辑移位运算符去掉最右边的掩码,它只移位零位。

   reversed = i<<24 | i>>8 & 0xff00 | i<<8 & 0xff0000 | i>>>24;

Operator precedence在这里,关于移位运算符的详细信息在 Java Language Specification 中。

关于java - 将 Little Endian 转换为 Big Endian,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3842828/

相关文章:

c - 哪些可移植性问题与 C 语言中指针的字节级访问相关?

java - Selenium Webdriver Java : Start the Chrome Browser with Extensions and my configuration

java - 从 Clojure 持久哈希中获取未知 key

java - Mockito 在 void 方法调用上打印消息

objective-c - 已弃用的 userInfo 字典键的可移植代码 (Cocoa)

windows - 最小的 Windows (PE) 可执行文件是什么?

java - 如何在没有警告的情况下调用构造函数?

c# - 如何通过静默提供用户凭据来打开共享点页面

c# - 可移植类库上的 WebProxy

java - 是否有分析 J2SE 应用程序对 Android 的可移植性的工具?