将小端序转换为大端序

2022-09-02 04:56:15

我一直在在线练习编码问题。目前,我正在研究一个问题陈述 问题 我们需要将大端<->小端序。但是我无法记下步骤,考虑到给出的示例:

123456789 converts to 365779719

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

但我显然在这里错过了一些东西。

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


答案 1

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

reverse = Integer.reverseBytes(x);

我不知道这个函数的效率如何,但是对于切换大量数字,a应该提供不错的性能。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 在注释中指出的那样,它是一种可选方法,可能并非在所有 Java 实现上都可用。ByteBuffer.putInt()

自主设计方法

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

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

我们可以通过调整位掩码来摆脱括号。例如,等效于 。无论如何,最右边的括号是不必要的。(a & 0xFF)<<8a<<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语言规范


答案 2

看看这个

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

推荐