Java ByteBuffer 将字节数组转换为整数时出现有符号和无符号类型问题

发布于 2024-11-15 10:25:57 字数 271 浏览 2 评论 0原文

我预料到了这一点:

ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == 222

然而,以下情况是正确的:

ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == -570425344

我如何解决 Java 对有符号/无符号类型的许多限制,或者我是否需要完全推出自己的限制?

I expected this:

ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == 222

However the following is true:

ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == -570425344

How do I get around this yet another of Java's many limitations with signed/unsigned types or do I need to completely roll my own?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

各自安好 2024-11-22 10:25:57

代码:

public static void main(String[] args) {
    ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 });
    System.out.println(bb.order());
    System.out.println(bb.getInt() == 222);
    bb.rewind();
    bb.order(ByteOrder.LITTLE_ENDIAN);
    System.out.println(bb.order());
    System.out.println(bb.getInt() == -570425344);
}

控制台:

BIG_ENDIAN
true
LITTLE_ENDIAN
true

附录:供参考,“新创建的字节缓冲区的顺序始终为 BIG_ENDIAN。”—ByteBuffer#order()< /代码>

Code:

public static void main(String[] args) {
    ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 });
    System.out.println(bb.order());
    System.out.println(bb.getInt() == 222);
    bb.rewind();
    bb.order(ByteOrder.LITTLE_ENDIAN);
    System.out.println(bb.order());
    System.out.println(bb.getInt() == -570425344);
}

Console:

BIG_ENDIAN
true
LITTLE_ENDIAN
true

Addendum: For reference, "The order of a newly-created byte buffer is always BIG_ENDIAN."—ByteBuffer#order()

审判长 2024-11-22 10:25:57

您观察到的结果对于小端机器来说是正确的。我怀疑如果您运行以下命令,您将得到 LITTLE_ENDIAN 作为答案。

ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 });
System.out.println(bb.order());

如果您想强制缓冲区采用大端排序,请执行以下操作:

ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 });
bb.order(ByteOrder.BIG_ENDIAN);
System.out.println(bb.order());
System.out.println(bb.getInt( ));

应打印出:

BIG_ENDIAN
222

The result you observe is correct for a little-endian machine. I suspect if you run the following, you'll get LITTLE_ENDIAN as the answer.

ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 });
System.out.println(bb.order());

If you want to force big-endian ordering for your buffer, do the following:

ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 });
bb.order(ByteOrder.BIG_ENDIAN);
System.out.println(bb.order());
System.out.println(bb.getInt( ));

Should print out:

BIG_ENDIAN
222
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文