繁体   English   中英

如何将负字节值转换为short或integer?

[英]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 ,则实际的长度信息将丢失。 但是,如果原始长度在128255之间,则可以将其取回。

转换为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转换回128255之间的数字。

如果使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM