作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我从来没有在这里写过,但就像几乎每个人一样,我经常阅读问题和答案......现在是我提问的时候了:)
所以,我正在阅读一段很长的代码,该代码在字节流上工作以解码电子护照的标签和值(ICAO Doc 9303 定义了国际技术规范)...直到我找到这部分之前,这并不困难(我在神秘部分之前和之后添加了注释)
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;
我知道它从输入流中逐字节读取,并增加字节流中的位置,但为什么它要执行移位并将结果保存在变量 len 中?如果我没记错的话,len 会被一遍又一遍地覆盖,那么这个变量在 for 循环之后怎么会有一个有意义的值呢?
最佳答案
正在处理lenlen
字节数,并将这些字节制成大端数:
案例长度为 <= 128
if
未输入,且 len
表示单个字节数
情况 len == 128+1、+2、+3、+4
分别使用1、2、3、4个字节:每个字节至少放置重要位置以及旧字节向左移动一个字节位置的位置 ( << 8
)。因此 129 代表 1 字节长度(对于 128 到 255 之间的数字),2 字节数字为 130。
最后:len
字节被跳过。
数据完整性需要检查原始 len >= 0、len <= 128 + 4 以及计算出的 len
也 >= 0。
编写过程你可能遇到的逆算法:
if (len <= 128) {
out.write((byte)len);
} else {
int bytes = 4 - Integer.numberOfLeadingZeroes(len) / 8;
out.write(128 + bytes);
for (int i = 0; i < bytes; ++i) {
int b = len >>>(bytes - 1);
out.write((byte)b); // Truncates the int to just 1 byte.
}
}
(假设 len
为正。)
关于java - 你明白这段代码的目的是什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57432494/
我是一名优秀的程序员,十分优秀!