1

機器によって生成されたバイナリ ログ ファイルを読み込んでいます。

byte[] にデータがあります。

short を作成するために 2 バイトを読み取る必要がある場合は、次のようなことができます。

short value = (short)(byte[1] << 8);
value += byte[2];

これで、値が有効なデータに対して正しいことがわかりました。

ファイルがめちゃくちゃで、値 FF FF がバイト配列のこれらの 2 つの場所にあったとしたら、どうすればわかりますか?

FF FF をショートに変換した結果の値を見ると、-1 が得られます。

これは FF FF の通常の値ですか? それとも、コンピュータが何らかのショート バウンドにヒットし、無効なデータでロール オーバーしただけですか?

私の目的では、これらの数値はすべて正になります。FF FF が実際に短い -1 である場合、すべての結果が正であることを検証する必要があります。

ありがとう、
キース

ところで、私は他の数値データ型も読んでいます。という理由だけでここに表示します。Read 関数は、byte[] からの読み取りの基本部分です。他のすべてのデータ型の読み取りでは、基本的な Read() 関数が使用されます。

    public byte Read()
    {
        //advance position and then return byte at position 

        byte returnValue;
        if (_CurrentPosition < _count - 1)
        {
            returnValue= _array[_offset + ++_CurrentPosition];
            return returnValue;
        }
        else
            throw new System.IO.EndOfStreamException
                   ("Cannot Read Array, at end of stream."); 
    }


    public float ReadFloat()
    {
        byte[] floatTemp = new byte[4];
        for (int i = 3; i >= 0; i--)
        {
            floatTemp[i] = Read();
        }

        float returnValue = System.BitConverter.ToSingle
            (floatTemp, 0);

        if (float.IsNaN(returnValue))
        {
            throw new Execption("Not a Number");    
        }
        return returnValue;
    }


    public short ReadInt16()
    {
        short returnValue = (short)(Read() << 8);
        returnValue += Read();
        return returnValue;
    }

    public int ReadInt32()
    {
        int returnValue = Read() << 24;
        returnValue += Read() << 16;
        returnValue += Read() << 8;
        returnValue += Read();
        return returnValue;
    }
4

6 に答える 6

3

0xffff(すべてのビットが 1 に等しい) は、符号付きショートの場合は -1 です。はい。詳細については、 2 の補数を参照してください。より大きなデータ型に切り替えるか、(Grzenio の提案に従って) 符号なしの型を使用することができます。

于 2008-11-06T15:37:58.830 に答える
2

BitConverterさて、あなたはシングルスを見つけたようです。他のすべてのものにも使用できるかどうか見てみましょう...

MemoryStream mem = new MemoryStream(_array);


float ReadFloat(Stream str)
{
   byte[] bytes = str.Read(out bytes, 0, 4);
   return BitConverter.ToSingle(bytes, 0)
}

public int ReadInt32(Stream str)
{
   byte[] bytes = str.Read(out bytes, 0, 4);
   return BitConverter.ToInt32(bytes, 0)
}
于 2008-11-06T15:48:49.730 に答える
1

ushort (unsigned short) を使用しようとしましたか?

于 2008-11-06T15:35:39.850 に答える
1

System.BitConverterクラスを使用したほうがよいと思います。

具体的には、ToInt16メソッドをショートさせます。

質問では言及しませんでしたが、ハードウェアデバイスがデータを書き込んでいるエンディアンを知っていることも確認する必要があります。例から、フロートはリトルエンディアンのように見えますが、整数はビッグエンディアンです? ハードウェア デバイスがバイナリ データの出力にエンディアンを混在させるとは思えません。

于 2008-11-06T15:59:03.563 に答える
1

はい 0xFFFF は、signed short の場合は -1 です。

また、BinaryReaderクラスを使用しないのはなぜですか?

于 2008-11-06T16:48:04.087 に答える
0

「ショート」の FFFF の値は -1 ですが、「符号なしショート」の FFFF の値は 65536 です。

この場合、すべての値が正であることが確実な場合は、unsigned short を使用していることを確認する必要があります。

于 2008-11-06T15:37:01.563 に答える