繁体   English   中英

在java中的字节屏蔽

[英]Byte masking in java

有一些我很难理解的东西,我有这段代码:

public class HelloWorld{

public static int readByte(byte b) {
    return b & 0xFF;
}

public static short readShort(byte[] b) {
    return (short)(readByte(b[0]) | readByte(b[1]) << 8);
}

 public static void main(String []args){
    byte[] b = {(byte)0x94, 0x00};
    System.out.println(readShort(b));

 }
}

现在返回的结果是148,但我不明白为什么如果我删除屏蔽“&0xFF”,结果会改变,如果你一次读取1个字节,0xFF的屏蔽不会影响byte(这就是我所知道的至少),我的一个朋友试图向我解释这个,他说这与字节“0x94”无符号相关,并且在readByte方法中继续进行,但是我无法理解它而且我'我真的很难理解为什么你需要掩盖才能正确读取字节,感谢任何想要帮助我的人!

一个字节是签名数据。 所以0x94是-108。 当您将其作为int返回时,返回-108扩展为4个字节,这不是0x94(其FFFFFF94)。 这显然搞砸了你以后的ORing。 掩码修复它,因为字节0x94在与0xFF进行AND运算之前转换为int,因此AND将从负扩展中删除那些额外的1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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