gpt4 book ai didi

java - 如何从java中的字节读取有符号整数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:29:38 24 4
gpt4 key购买 nike

我有一个规范,它读取接下来的两个字节是有符号的 int。

要在 java 中阅读,我有以下内容

当我使用以下代码在 java 中读取一个有符号的 int 时,我得到一个值 65449

unsigned的计算逻辑

int a =(byte[1] & 0xff) <<8

int b =(byte[0] & 0xff) <<0

int c = a+b

我认为这是错误的,因为如果我和 0xff 我得到一个无符号的等价物

所以我删除了 & 0xff 和下面给出的逻辑

int a = byte[1] <<8
int b = byte[0] << 0
int c = a+b
which gives me the value -343
byte[1] =-1
byte[0]=-87

我试图用规范读取的方式来抵消这些值,但这看起来是错误的。因为堆的大小不在此范围内。

在 java 中计算 signed int 的正确方法是什么?

规范是这样的

somespec() { xtype 8 uint8 xStyle 16 int16 } xStyle :一个带符号的整数,表示从此 Widget() 结构的开头到 xStyle() 结构的开头的偏移量(以字节为单位),该结构表示由页面小部件定义的继承样式以及专门应用于此小部件的样式.

最佳答案

如果您的值是一个带符号的 16 位,您需要一个 short,而 int 是 32 位,它也可以保存相同的值,但不是那么自然。

看来您需要一个带符号的小端 16 位值。

byte[] bytes = 
short s = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getShort();

short s = (short) ((bytes[0] & 0xff) | (bytes[1] << 8));

顺便说一句:您可以使用 int 但它不是那么简单。

// to get a sign extension.
int i = ((bytes[0] & 0xff) | (bytes[1] << 8)) << 16 >> 16;

int i = (bytes[0] & 0xff) | (short) (bytes[1] << 8));

关于java - 如何从java中的字节读取有符号整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7157901/

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