【发布时间】:2012-07-26 01:08:13
【问题描述】:
来自Java Virtual Machine specification:
class文件由 8 位字节流组成。所有 16 位、32 位和 64 位量都是通过分别读取两个、四个和八个连续的 8 位字节来构造的。多字节数据项始终以大端顺序存储,高字节在先。在 Java 平台中,接口 java.io.DataInput 和java.io.DataOutput以及 java.io.DataInputStream 和 java.io.DataOutputStream 等类都支持这种格式。本章定义了自己的一组数据类型,表示
class文件数据:u1、u2和u4类型分别表示无符号的一、二或四字节数量。在Java平台中,这些类型可以通过接口java.io.DataInput的readUnsignedByte、readUnsignedShort、readInt等方法读取。
除了提到“64 位数量”(没有u8、long and double 分为两个u4 项)之外,我不明白如何处理u4 类型。
对于u1 和u2,很明显:
-
u1:使用readUnsignedByte读取,存储在int -
u2:使用readUnsignedShort读取,存储在int
规范建议这样做:
-
u4:使用readInt读取,存储在int(?)
大于Integer.MAX_VALUE 的值会怎样?这个建议是否暗指u4 类型的所有值都小于或等于Integer.MAX_VALUE?
我想出了这个主意:
-
u4:使用readUnsignedInt读取,存储在long
不幸的是,there is no such method。但这不是问题,因为您可以轻松编写自己的代码:
public long readUnsignedInt() throws IOException {
return readInt() & 0xFFFFFFFFL;
}
所以,这里有两个值得怀疑的地方:
-
代码属性{
...
u4 code_length;
u1 代码[code_length];
...
}为什么
code_length不是u2类型? Later it says:code_length项的值必须小于 65536。 -
SourceDebugExtension attribute:
SourceDebugExtension_attribute {
...
u4 属性长度;
u1 debug_extension[attribute_length];
}
...
请注意,debug_extension数组表示的字符串可能比String类的实例可以表示的字符串长。为什么?
u4的值确实可以超过Integer.MAX_VALUE(因为我认为这是String实例的最大长度)?
【问题讨论】:
标签: java jvm bytecode unsigned