0

BitConverter を使用する既存の C# コードを Java に移植しようとしています。他にもさまざまなスレッドを見つけましたが、そのトリックを実行しているように見える github クラスに出くわしました。ただし、ToUInt16 は私の C# コードからの出力と一致しません。ToInt16 と ToInt32 は同じ値を返しているようです。この実装の何が問題なのか (または、おそらく私が間違っていること) を理解するのを手伝ってもらえますか?

コード参照: Java BitConverter

ToUInt16:

public static int ToUInt16(byte[] bytes, int offset) {
        int result = (int)bytes[offset+1]&0xff;
        result |= ((int)bytes[offset]&0xff) << 8;
        if(Lysis.bDebug)
            System.out.println(result & 0xffff);
        return result & 0xffff;
    }

ToUInt32:

public static long ToUInt32(byte[] bytes, int offset) {
    long result = (int)bytes[offset]&0xff;
    result |= ((int)bytes[offset+1]&0xff) << 8;
    result |= ((int)bytes[offset+2]&0xff) << 16;
    result |= ((int)bytes[offset+3]&0xff) << 24;
    if(Lysis.bDebug)
        System.out.println(result & 0xFFFFFFFFL);
    return result & 0xFFFFFFFFL;
}

MyCode スニペット:

byte[] byteArray = from some byte array
int offset = currentOffset
int msTime = BitConverter.ToUInt16(byteArray, offset)

msTime が C# からのものと一致しない

C# の例 (ベンダーからの文字列は、Convert.FromBase64String を使用して文字列から変換されます)

byte[] rawData = Convert.FromBase64String(vendorRawData);
    byte[] sampleDataRaw = rawData;

    Assert.AreEqual(15616, sampleDataRaw.Length);

    //Show byte data for msTime
    Console.WriteLine(sampleDataRaw[7]);
    Console.WriteLine(sampleDataRaw[6]);

    //Show byte data for msTime
    Console.WriteLine(sampleDataRaw[14]);
    Console.WriteLine(sampleDataRaw[13]);

    var msTime = BitConverter.ToUInt16(sampleDataRaw, 6);
    var dmWindow = BitConverter.ToUInt16(sampleDataRaw, 13);
    Assert.AreEqual(399, msTime);
    Assert.AreEqual(10, dmWindow);

バイト値の C# コンソール出力:

1
143
0
10

Groovy の例 (ベンダーからの文字列は、groovy の decodeBase64() を使用して文字列から変換されます)

    def rawData = vendorRawData.decodeBase64()
    def sampleDataRaw = rawData
    Assert.assertEquals(15616, rawData.length)

    //Show byte data for msTime
    println sampleDataRaw[7]
    println sampleDataRaw[6]

    //Show byte data for dmWindow
    println sampleDataRaw[14]
    println sampleDataRaw[13]

    def msTime = ToUInt16(sampleDataRaw, 6)
    def dmWindow = ToUInt16(sampleDataRaw, 13)
    Assert.assertEquals(399, msTime)
    Assert.assertEquals(10, dmWindow)

**Asserts fail with** 

    399 fro msTime is actually 36609
    10 from dmWindow is actually 2560

printlnのByte値からのGroovy出力

1
-113
0
10
4

2 に答える 2

0

私が実際に見つけたのは、ソリューション内の ToUInt16 ではなく、ToInt16 が実際に私が望んでいた結果を提供しているということでした。かなりの数の結果を確認しましたが、それらはすべて .Net 出力と一致しています。

ソースコードを見ることができる @pinkfloydx33 からのリンクは、実際に ToUInt16 の代わりに ToInt16 を使用しようとした理由です。

于 2017-03-01T06:08:45.693 に答える