[英]How to convert negative byte value to either short or integer?
我们有一个文件,其中包含特定格式的字节数组,例如标头,然后是数据。 该文件是由另一个Java程序生成的,然后我们正在通过另一个Java程序以与该文件相同的格式读取该文件。
生成该文件的程序将lengthOfKey
填充为正确的字节,这就是我们所需要的,如下所示。
for (Map.Entry<byte[], byte[]> entry : holder.entrySet()) {
byte typeKey = 0;
// getting the key length as byte (that's what we need to do)
byte lengthOfKey = (byte) entry.getKey().length;
byte[] actualKey = entry.getKey();
}
现在,由于byte
只能存储最大值127
,因此我们在读取文件时看到某些记录的lengthOfKey
负数,如下所示:
正在读取文件的程序:
byte keyType = dis.readByte();
// for some record this is coming as negative. For example -74
byte lengthOfKey = dis.readByte();
现在我的问题是:有什么办法可以找出密钥的实际长度,因为在编写时将其转换为-74
。 我的意思是应该大于127
,这就是为什么将其转换为-74
的原因,但实际值是多少?
我认为问题是如何将负字节值转换为短整数或整数? 我只想验证一下密钥的实际长度,因为它已转换为负值。
如果来自entry.getKey().length
的原始长度大于255
,则实际的长度信息将丢失。 但是,如果原始长度在128
和255
之间,则可以将其取回。
转换为byte
的狭窄转换仅保留最低有效的8位,但是第8位现在被解释为-128
而不是128
。
您可以使用0xFF
执行位与运算,该操作将保留所有位,但会将值隐式扩展为int
。
int length = lengthOfKey & 0xFF;
lengthOfKey (byte = -74): 10110110
将其扩展为int
,并带有符号扩展名:
lengthOfKey (int = -74): 11111111 11111111 11111111 10110110
将最后8位屏蔽为int
:
length (int = 182): 00000000 00000000 00000000 10110110
这会将负byte
转换回128
到255
之间的数字。
如果使用Guava ,它将提供许多未签名的数学实用程序 ,包括UnsignedBytes
。
UnsignedBytes.toInt(lengthOfKey);
注意,它们对toInt()
的实现正是@rgettman建议的。
将假定的无符号字节转换为int。
int value = (byteValue >= (byte) 0) ? (int) byteValue : 256 + (int) byteValue;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.