2015-06-16 40 views
1

我们有一个文件,其中包含特定格式的字节数组,例如标题,然后是数据。这个文件是由另一个java程序生成的,然后我们通过另一个java程序以与它相同的格式读取同一个文件。如何将负字节值转换为short或integer?

这是使该文件的程序,填充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,但实际价值是多少?

我想的问题是如何负字节值转换为短或整数?我只是想验证一下,看看密钥的实际长度是多少,因为密钥已经转换为负值。

回答

3

如果原始长度从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之间。

+0

感谢您的解释。我能够解码数据,我可以看到它的实际长度。你能解释我为什么这么说吗? '如果来自entry.getKey()。length的原始长度大于255,则实际长度信息将丢失。“以及为什么它会丢失?只是为了我的理解目的。 – john

+0

如果您收到了长度为0的字符,那么它在256字节的'byte“形式中是无法区分的。二进制中的“0”是00000000,二进制中的“256”是1 00000000,但当发生缩小转换为“字节”时丢失“1”,并且它显示为“0”。 – rgettman

0

将假定的无符号字节转换为int。

int value = (byteValue >= (byte) 0) ? (int) byteValue : 256 + (int) byteValue;