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