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

标签 java binary

我有一个规范,它读取接下来的两个字节是有符号的 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/

相关文章:

java - Hotspot JVM - G1GC 堆大小调整问题

java - org.hibernate.hql.ast.QuerySyntaxException 表未映射

java - 独立 jar 滞后

json - 在 Erlang 中处理 badarg

c - 如何在 C 语言中访问给定字节的特定位?

sql-server - 在 SQL Server 存储过程中使用十进制到二进制的转换

java - 如何使用 Array、List、HashMap 或 HashSet - 创建 BitmapFields 的长列表? ( java 、黑莓)

java - 当我们在类级别实现多线程时,testNG 报告在内部如何工作?

java - 解析二进制数据

git - 在 git 中跟踪 sqlite3 二进制文件的正确方法?