gpt4 book ai didi

java - 将 Little Endian 转换为 Big Endian

转载 作者:太空狗 更新时间:2023-10-29 22:36:06 25 4
gpt4 key购买 nike

全部,

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com