1

C#の関数に相当するJavaを書き込もうとしています。コードは次のとおりです。

C#の場合:

byte[] a = new byte[sizeof(Int32)];
readBytes(fStream, a, 0, sizeof(Int32)); //fstream is System.IO.Filestream
int answer = BitConverter.ToInt32(a, 0);

Javaの場合:

InputStream fstream = new FileInputStream(fileName);
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
byte[] a = new byte[4];
readBytes(in, a, 0, 4);
int answer = byteArrayToInt(a);

JavaとC#の両方:

int readBytes(Stream stream, byte[] storageBuffer, int offset, int requiredCount)
        {
            int totalBytesRead = 0;
            while (totalBytesRead < requiredCount)
            {
                int bytesRead = stream.Read(
                                storageBuffer,
                                offset + totalBytesRead,
                                requiredCount - totalBytesRead);
                if (bytesRead == 0)
                {
                    break; // while
                }

                totalBytesRead += bytesRead;
            }

            return totalBytesRead;
        }

出力:

In C#: answer = 192  (Correct)  
In JAVA: answer = -1073741824 

2つには違いがあります。エンコードされたファイル入力ストリームから読み取り、最初の4バイトを解析しています。C#コードは正解である192を生成するようですが、Javaは間違った答えである-1073741824を生成します。なぜ、どのように?

編集

これが私のbyteArrayToIntです

public static int byteArrayToInt(byte[] b, int offset) {
        int value = 0;
        for (int i = 0; i < 4; i++) {
            int shift = (4 - 1 - i) * 8;
            value += (b[i + offset] & 0x000000FF) << shift;
        }
        return value;
    }

ソリューション byteArrayToIntの適切なソリューション

public static int byteArrayToInt(byte[] b) 
    {
        long value = 0;
        for (int i = 0; i < b.length; i++)
        {
           value += (b[i] & 0xff) << (8 * i);
        }
        return (int) value;
    }

これにより、適切な出力が得られます

4

2 に答える 2

10

Java バイトでは署名されているため、Java バイトの -64 は C# バイトの 192 と同等のバイナリです (192 == 256 - 64)。

問題はbyteArrayToInt()、変換中に署名されていないと想定する場所にある可能性があります。

シンプルな

 `b & 0x000000FF`

その場合に役立つかもしれません。

于 2012-04-09T07:53:40.350 に答える
2

Java の byte オブジェクトは、soulcheck が書いたように署名されています。符号なし 8 ビット整数の 192 のバイナリ値は11000000.

この値を符号付き形式で読み取っている場合、先頭の 1 は負を示します。これは、-64 に11000000なることを意味します。negative 01000000

于 2012-04-09T07:56:43.447 に答える