转换Little Endian到Big Endian

所有,

我一直在网上练习编码问题。 目前我正在处理一个问题声明问题 ,我们需要转换Big Endian < – >小端。 但是我不能记下考虑给出的例子的步骤:

123456789 converts to 365779719 

我正在考虑的逻辑是:
1>获取整数值(因为我在Windows x86上,input是Little Endian)
2>生成相同的hex表示。
3>反转表示并生成大端的整数值

但是我显然在这里失去了一些东西。

任何人都可以请指导我。 我在Java 1.5编码

你需要意识到的是endian交换处理代表整数的字节。 所以4个字节的数字27看起来像0x0000001B 。 要转换该数字,它需要去0x1B000000 …在你的例子中,123456789的hex表示是0x075BCD15需要去0x15CD5B07或以十进制forms365779719。

发布的函数堆栈器正在移动这些字节,通过位移它们; 更具体地说, i&0xffi最低字节, << 24然后把它移到24位,所以从位置1-8到25-32。 那么通过expression式的每个部分。

例如代码,看看这个实用程序。

看一下这个

 int little2big(int i) { return (i&0xff)<<24 | (i&0xff00)<<8 | (i&0xff0000)>>8 | (i>>24)&0xff; } 

由于编写软件的很大一部分是关于重用现有的解决scheme,所以首先应该查看你的语言/库的文档。

 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); 

正如在注释中指出的那样, ByteBuffer.putInt()是一个可选的方法,可能在所有的Java实现上都不可用。

DIY方法

堆垛机的答案非常整齐,但可以改进。

  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; 

在这里的运算符优先级 ,移位运算符的详细细节在Java语言规范中

我认为这也可以帮助:

 int littleToBig(int i) { int b0,b1,b2,b3; b0 = (i&0x000000ff)>>0; b1 = (i&0x0000ff00)>>8; b2 = (i&0x00ff0000)>>16; b3 = (i&0xff000000)>>24; return ((b0<<24)|(b1<<16)|(b2<<8)|(b3<<0)); } 

以下方法反转字节值中的位的顺序:

 public static byte reverseBitOrder(byte b) { int converted = 0x00; converted ^= (b & 0b1000_0000) >> 7; converted ^= (b & 0b0100_0000) >> 5; converted ^= (b & 0b0010_0000) >> 3; converted ^= (b & 0b0001_0000) >> 1; converted ^= (b & 0b0000_1000) << 1; converted ^= (b & 0b0000_0100) << 3; converted ^= (b & 0b0000_0010) << 5; converted ^= (b & 0b0000_0001) << 7; return (byte) (converted & 0xFF); }