通過網絡請求圖片頭部信息(不下載完整圖片)解析 JPEG 尺寸。關鍵代碼片段涉及位運算提取寬高:
// 假設 data 是包含 SOF 段數據的 byte[]
int width = (data[0] << 8) | (data[1] & 0xFF);
int height = (data[2] << 8) | (data[3] & 0xFF);
JPEG 文件由多個段組成,SOF (Start of Frame) 段包含圖像基本信息:
標識符 (2 bytes): 0xFFC0 (Baseline DCT) 長度 (2 bytes): 段長度(含長度字段) 精度 (1 byte): 通常 8 高度 (2 bytes): 大端序 寬度 (2 bytes): 大端序 ...
網絡傳輸與 JPEG 標準均采用大端序,即高位字節在前。Java byte 是有符號 8 位,直接移位會符號擴展,需配合 & 0xFF 轉為無符號整數。
// data[0] = 高位字節,data[1] = 低位字節
int high = data[0] & 0xFF; // 如 0x12 -> 18
int low = data[1] & 0xFF; // 如 0x34 -> 52
// 高位左移 8 位,佔據高 16 位;低位佔據低 16 位
int width = (high << 8) | low; // 0x1234 = 4660
short/int 佔 2 字節(16 位)。| 合併為完整 16 位整數。0xFF 標記,找到 SOF 段(0xFFC0~0xFFCF,排除 0xFFC4 DHT, 0xFFC8 JPGE 等)。public static Dimension getJpegSize(InputStream in) throws IOException {
byte[] buf = new byte[4];
// ... 定位到 SOF 段數據起始位置 ...
in.read(buf, 0, 4); // 讀取高度高、高度低、寬度高、寬度低
int height = ((buf[0] & 0xFF) << 8) | (buf[1] & 0xFF);
int width = ((buf[2] & 0xFF) << 8) | (buf[3] & 0xFF);
return new Dimension(width, height);
}
左移運算符 << 用於將高位字節移至正確位置,配合 & 0xFF 消除符號擴展,實現大端序字節序到宿主整數的正確轉換。這是二進制協議解析、網絡編程、文件格式分析中的基礎技能。