全部,
我一直在网上练习编码问题。目前我正在处理一个问题陈述 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/