gpt4 book ai didi

java - 你明白这段代码的目的是什么吗?

转载 作者:行者123 更新时间:2023-12-02 01:22:33 24 4
gpt4 key购买 nike

我从来没有在这里写过,但就像几乎每个人一样,我经常阅读问题和答案......现在是我提问的时候了:)

所以,我正在阅读一段很长的代码,该代码在字节流上工作以解码电子护照的标签和值(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com