2012-03-16 26 views
3

正直なところ、C#でバイナリファイルを読むのは混乱します。 私はバイナリファイルを読み込むためのC++コードを持っている:C++からC#へのバイナリ読み取り関数の変換

FILE *pFile = fopen(filename, "rb");  
uint n = 1024; 
uint readC = 0; 
do { 
    short* pChunk = new short[n]; 
    readC = fread(pChunk, sizeof (short), n, pFile);  
} while (readC > 0); 

をし、それが次のデータを読み取ります

-156, -154, -116, -69, -42, -36, -42, -41, -89, -178, -243, -276, -306,... 

私はC#1にこのコードを変換しようとしたが、そのようなデータを読み取ることができません。ここでは、コードです:

using (var reader = new BinaryReader(File.Open(filename, FileMode.Open))) 
{ 
    sbyte[] buffer = new sbyte[1024];     
    for (int i = 0; i < 1024; i++) 
    { 
     buffer[i] = reader.ReadSByte(); 
    }     
} 

は、iは、以下のデータを取得:

100, -1, 102, -1, -116, -1, -69, -1, -42, -1, -36 

にはどうすれば同様のデータを得ることができますか?

+0

である、あなたは2バイトである' short'、各エンティティを読んでいますこれは1バイトです。 – Jason

+0

@Jason確かにC++では 'short'のサイズは完全には定義されていません; p:しかし、私は同意しません。それを答えとして追加する必要があります。 –

+0

C/C++の経験はありません;/ – Jason

答えて

2

shortは符号付きバイトではなく、符号付き16ビット値です。

short[] buffer = new short[1024];     
for (int i = 0; i < 1024; i++) { 
    buffer[i] = reader.ReadInt16(); 
} 
2

これは、C++では短く、C#では符号付きバイトを読み込んでいるからです(これがSByteの意味です)。 reader.ReadInt16()

1

正しい出力を得るには、同じデータ型を使用するか、新しい型にキャストする必要があります。

C++ではshortを使用しています。 (私もファイルがshortと書かれていると思います)ので、shortをC#で使用してください。 Sytem.Int16を使用することもできます。

shortsbyteは同等ではないため、値が異なります。 C#で、あなたは `sbyte`として各エンティティを読んでいるのに対し、shortは2バイトで、Sbyteは、C++では1バイト

using (var reader = new BinaryReader(File.Open(filename, FileMode.Open))) 
{ 
    System.Int16[] buffer = new System.Int16[1024];     
    for (int i = 0; i < 1024; i++) 
    { 
     buffer[i] = reader.ReadInt16(); 
    }     
} 
関連する問題