【发布时间】:2019-08-09 14:47:54
【问题描述】:
我从不在这里写信,但和几乎每个人一样,我经常阅读问题和答案……现在是我提问的时候了:)
所以,我正在阅读一段很长的代码,该代码适用于字节流以解码电子护照的标签和值(ICAO Doc 9303 定义了国际技术规范)......直到我找到这部分内容并不难(我在神秘部分前后放置了cmets)
int len = s.read(); // s is an InputStream
readPos++;
if ((len > 0x80)) {
int lenlen = len - 0x80;
len = 0;
for (int i = 0; (i < lenlen); i++) {
if ((readPos == length)) {
throw new ParseException();
}
// wtf begin
len = (len << 8) | ((byte) (s.read()));
// wtf end
readPos++;
}
}
size = readPos + len;
我知道它从 InputStream 中逐字节读取,并增加字节流中的位置,但为什么它执行移位并将结果保存在变量 len 中?如果我没记错的话,len 会被一遍又一遍地覆盖,那么这个变量在 for 循环之后怎么会有有意义的值呢?
【问题讨论】:
-
它正在逐字节读取 len 变量。最高有效字节首先出现。比你乘以 8(字节大小)并添加下一个字节(这里用按位或写)。想想逐位读取一个数字。