如何在Java或python中获得字节序?
Posted
技术标签:
【中文标题】如何在Java或python中获得字节序?【英文标题】:how to get endianess in Java or python? 【发布时间】:2014-01-24 19:54:07 【问题描述】:在C
我可以通过以下方法得到机器的Endianess
。我将如何使用python
或Java
程序?在 Java 中,char 是 2-bytes
,而 C
是 1-byte
。我认为python
可能不可能,因为它是dynamic language
,但我可能错了
bool isLittleEndian()
// 16 bit value, represented as 0x0100 on Intel, and 0x0001 else
short pattern = 0x0001;
// access first byte, will be 1 on Intel, and 0 else
return *(char*) &pattern == 0x01;
【问题讨论】:
理论上你不需要知道也不需要关心它。为什么要知道字节序? 不管平台如何,Java 总是大端的。 @rgettman 当然,我知道这些信息。但是否可以编码。这是一道面试题 查看这篇文章:***.com/questions/2188660/… 【参考方案1】:在 Java 中,它只是
ByteOrder.nativeOrder();
...返回BIG_ENDIAN
或LITTLE_ENDIAN
。
http://docs.oracle.com/javase/6/docs/api/java/nio/ByteOrder.html
【讨论】:
但你只需要在处理操作机器级数据缓冲区等的“奇数”接口(例如 nio)时才需要知道这一点。【参考方案2】:short
的 (byte)
转换在 Java 和 C 中都定义为返回 short
的“小”端,无论处理器的字节顺序如何。并且>>
被定义为从“大”端转移到“小”端(<<
则相反),无论处理器的字节顺序如何。同样,+
、-
、*
、/
等都被定义为独立于处理器字节序。
因此,Java 或 C 中的任何操作序列都不会检测字节序。需要的是某种大小值在另一个之上的某种“别名”(例如获取int
的地址并转换为char*
),但Java 没有任何方法可以做到这一点。
【讨论】:
感谢您的回答。请看这个:bits.stephan-brumme.com/endianess.html;我比 C 更熟悉 Java。这就是为什么我有兴趣使用按位运算而不是使用 ByteOrder.native.Order() 在 Java 中获得字节顺序 @user1988876 - 该页面顶部的例程是 C 代码,它使用short
和 char
的别名来完成它的脏活。正如我所说,在 Java 中没有办法做这样的别名。
感谢您指出我帖子中的错误...删除它,因为我讨厌不良信息,并且在我的帖子中显然不正确。【参考方案3】:
import java.nio.ByteOrder;
public class Endian
public static void main(String argv[])
ByteOrder b = ByteOrder.nativeOrder();
if (b.equals(ByteOrder.BIG_ENDIAN))
System.out.println("Big-endian");
else
System.out.println("Little-endian");
变态
【讨论】:
【参考方案4】:你可以使用sys.byteorder:
>>> import sys
>>> print sys.byteorder
'little'
或者您也可以借助内置的struct 模块自行获得字节序:
import struct
def is_little():
packed = struct.pack("i", 1)
return packed[0] == "\x01";
print is_little()
当然,这都是 Python。
【讨论】:
以上是关于如何在Java或python中获得字节序?的主要内容,如果未能解决你的问题,请参考以下文章