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

标签 java parsing

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

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

相关文章:

java - 如何以线程安全的方式实现AWS S3客户端?

java - Spark Cassandra 连接器 3.0.0 - 如何启用 DirectJoin - Java

java - 使用 Java 方法 indexof 与 substring 结合创建新字符串时出现错误输出

python - python中仅从html文档中获取主要文本

python - 使用 Python(ElementTree?)解析非常大的 HTML 文件

Android的XML解析技术

java - 关于音频采集的机制;安卓、Java

java - Spring是否支持OpenJDK 12

php - 像简单的 HTML DOM 一样解析 CSS

ios - 使用 Codable 解析 JSON 响应会 swift 出错