我遇到了一些代碼,它具有位掩碼0xff
和0xff00
或16位二進制形式00000000 11111111
和11111111 00000000
。位移位和位掩碼 - 示例代碼
/**
* Function to check if the given string is in GZIP Format.
*
* @param inString String to check.
* @return True if GZIP Compressed otherwise false.
*/
public static boolean isStringCompressed(String inString)
{
try
{
byte[] bytes = inString.getBytes("ISO-8859-1");
int gzipHeader = ((int) bytes[0] & 0xff)
| ((bytes[1] << 8) & 0xff00);
return GZIPInputStream.GZIP_MAGIC == gzipHeader;
} catch (Exception e)
{
return false;
}
}
我想了解在這種情況下(針對字節數組)使用這些位掩碼的目的是什麼。我看不出它會有什麼不同?
在gzip壓縮字符串作爲此方法的上下文中似乎是gzip的幻數被寫入是35615
,8B1F
在十六進制和二進制10001011 00011111
。
我正確地認爲這是交換字節嗎?因此,例如說我的輸入字符串是\u001f\u008b
bytes[0] & 0xff00
bytes[0] = 1f = 00011111
& ff = 11111111
--------
= 00011111
bytes[1] << 8
bytes[1] = 8b = 10001011
<< 8 = 10001011 00000000
((bytes[1] << 8) & 0xff00)
= 10001011 00000000 & 0xff00
= 10001011 00000000
11111111 00000000 &
-------------------
10001011 00000000
所以
00000000 00011111
10001011 00000000 |
-----------------
10001011 00011111 = 8B1F
對我來說,它看起來像&
沒有做任何事情的原始字節在兩種情況下bytes[0] & 0xff
和(bytes[1] << 8) & 0xff00)
。我錯過了什麼?