Java仮想マシン仕様から:
classファイルは、8ビットバイトのストリームで構成されます。すべての16ビット、32ビット、および64ビットの量は、それぞれ2、4、および8つの連続する8ビットバイトを読み取ることによって構成されます。マルチバイトデータ項目は常にビッグエンディアンの順序で格納され、上位バイトが最初になります。java.io.DataOutputJavaプラットフォームでは、このフォーマットは、インターフェースjava.io.DataInputと、java.io.DataInputStreamやjava.io.DataOutputStreamなどのクラスによってサポートされます。
classこの章では、ファイルデータを表す独自のデータ型のセットを定義します。型u1、、、u2およびu4は、それぞれ符号なしの1バイト、2バイト、または4バイトの量を表します。readUnsignedByteJavaプラットフォームでは、これらのタイプは、、、readUnsignedShortおよびreadIntインターフェイスのメソッドによって読み取ることができますjava.io.DataInput。
「64ビット量」(no u8、long、doubleは2つの項目に分割されています)についての苛立たしい言及を除けば、タイプu4の処理方法がわかりません。u4
u1とそれはu2明らかです:
u1:で読んでreadUnsignedByte、intu2:で読んでreadUnsignedShort、int
仕様はこれをアドバイスしています:
u4:で読んで、 (?)readIntに保存するint
より大きい値はどうなりInteger.MAX_VALUEますか?u4このアドバイスは、タイプのすべての値が以下であることを黙って暗示していますInteger.MAX_VALUEか?
私はこのアイデアを思いついた:
u4:で読んでreadUnsignedInt、long
残念ながら、そのような方法はありません。しかし、それは問題ではありません。自分で簡単に書くことができるからです。
public long readUnsignedInt() throws IOException {
return readInt() & 0xFFFFFFFFL;
}
したがって、ここに2つの疑わしいスポットがあります。
コード属性:
Code_attribute {
...
u4 code_length;
u1コード[コード長];
...
}なぜ
code_lengthタイプではないのu2ですか?後でそれは言う:アイテムの値は
code_length65536未満である必要があります。SourceDebugExtension属性:
SourceDebugExtension_attribute {
...
u4 attribute_length;
u1 debug_extension [attribute_length];
}
...配列は、クラスのインスタンスで表すことができる文字列よりも長い文字列を示す場合があること
に注意してください。debug_extensionStringなんで?
u4値は実際に超えることができますか(これはインスタンスInteger.MAX_VALUEの最大長だと思うので)?String