gpt4 book ai didi

java - 你能告诉我这两种从输入流读取字节的方法是做什么的吗?

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

我正在尝试理解 b+ 树的实现。我不明白这个重载方法到底做了什么。为什么在第一个方法中以 Inputsteam 作为参数声明 4 个变量,即 i1、i2、i3 和 i4。在使用 ObjectInput in 作为参数的第二种方法中,我理解它返回一个从0到255的字节,为什么result=251?解释每一行及其作用将会很有帮助。

第一种方法:

    public final static int readLuposInt(final InputStream is) throws IOException {
final int i1 = is.read();
if (i1 < 0) {
return i1;
}
final int i2 = is.read();
if (i2 < 0) {
return i2;
}
final int i3 = is.read();
if (i3 < 0) {
return i3;
}
final int i4 = is.read();
if (i4 < 0) {
return i4;
}
return (0xFF & i1) | ((0xFF & i2) | ((0xFF & i3) | (0xFF & i4) << 8) << 8) << 8;

}

重载方法:

public final static int readLuposInt(final ObjectInput in) throws IOException {
final int i0 = in.read();
if (i0 <= 251){
return i0;
}
int result = 251;
int offset = 1;
for (int i = 1; i <= i0 - 251; i++) {
result += in.read() * offset;
offset <<= 8;
}
return result;
}

最佳答案

您可以使用调试器来查找以下结果。

第一个方法从输入流中读取 4 字节整数。它似乎存储为 little-endian值(value)。

  • 按顺序读取字节
  • ff 任何字节丢失,-1已返回。
  • 要返回完整的整数,请通过 shifting 进行计算左侧的较高有效字节。

示例:

  • 号码2293742代表十六进制数 22 FF EE ,将以相反顺序存储:0xEE 0xFF 0x22 0x00
  • 现在数据已被读取
    • i1 = 0xEE
    • i2 = 0xFF
    • i3 = 0x22
    • i4 = 0x00
  • 现在计算返回值:
    • (0xFF & i4) << 8 = (0xFF & 0x00) << 8 = 0x0000
    • ((0xFF & i3) | (0xFF & i4) << 8) << 8) = ((0x22 | 0x0000) << 8) = (0x0022 << 8) = 0x002200
    • ((0xFF & i2) | ((0xFF & i3) | (0xFF & i4) << 8) << 8) << 8 = (0xFF | 0x002200) << 8 = 0x0022FF00
    • (0xFF & i1) | ((0xFF & i2) | ((0xFF & i3) | (0xFF & i4) << 8) << 8) << 8 = 0xEE | 0x0022FF00 = 0x0022FFEE

第二种方法从流中读取 unicode 字符,以 UTF-8 编码进行编码。关于 unicode 及其字符编码可以说很多,请参阅 Wikipedia这是如何运作的。

关于java - 你能告诉我这两种从输入流读取字节的方法是做什么的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40876061/

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