0

両方の 32 ビット整数を組み合わせると、64 ビットの長整数を形成するはずですが、32 ビットの負の値のままです。どうしたの?

この行だけで、32 ビットよりも大きな数値が生成されるはずです。(readDword() And &HFFFFFFFF) << 32)

テスト用の VB.NET コード

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim u As Long = ((readDword() And &HFFFFFFFF) << 32) Or _
        (readDword2() And &HFFFFFFFF)
End Sub

Function readDword() As Integer
    Dim i As Integer = (((0 And &HFF) << 24) Or _
((0 And &HFF) << 16) Or _
((11 And &HFF) << 8) Or _
(58 And &HFF))
    Return i
End Function

Function readDword2() As Integer
    Dim i As Integer = (((241 And &HFF) << 24) Or _
((145 And &HFF) << 16) Or _
((136 And &HFF) << 8) Or _
(247 And &HFF))
    Return i
End Function



期待される結果
-----------------------------
入力バイト数 =0,0,11,58,241,145,136,247
得られる結果 =-242119681
期待される結果 = 12347788855543
--------- ----------------------


これは適切に機能しますが、逆なので、ビットごとに自分でやろうとします

    Dim bytesz() As Byte = New Byte() {247, 136, 145, 241, 58, 11, 0, 0}
    Dim a As Int64 = BitConverter.ToInt64(bytesz, 0)

Java でのバイトの書き方

  public void writeQWord(long l) throws IOException {
    write((int) (l >> 56)); //0
    write((int) (l >> 48)); //0
    write((int) (l >> 40)); //11
    write((int) (l >> 32)); //58
    write((int) (l >> 24)); //241
    write((int) (l >> 16)); //145
    write((int) (l >> 8));  //136
    write((int) (l));   }   //247

修繕

適切なコードは次のとおりです。

Public Function ReadQWord() As Long
    Return (CLng(ReadDWord() And &HFFFFFFFFL) << 32) Or CLng(ReadDWord() And &HFFFFFFFFL)
End Function
4

1 に答える 1

1

ビット単位の演算子と定数を使用する場合は、定数の型が使用法を反映していることを確認してください。

これ

    Dim u As Long = 1 << 32

この

    Dim u As Long = 1L << 32

さまざまな結果を生み出します。また、関数 readDword は、戻り値としても内部的にも整数のみを生成していることに気付きました。

于 2013-07-06T13:36:24.807 に答える