Преобразование двоичной функции чтения из C ++ в C # - PullRequest
3 голосов
/ 16 марта 2012

Я, честно говоря, очень запутался при чтении бинарных файлов в 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 #, но не могу прочитать такие данные.Вот код:

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();
     }                
}

, и я получаю следующие данные:

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

Как я могу получить аналогичные данные?

Ответы [ 4 ]

2 голосов
/ 16 марта 2012

Это потому, что в C ++ вы читаете шорты, а в C # вы читаете байты со знаком (вот почему SByte означает).Вы должны использовать reader.ReadInt16()

2 голосов
/ 16 марта 2012

Ваш код C ++ читает 2 байта за раз (вы используете sizeof (short)), в то время как ваш код C # читает один байт за раз. SByte (см. http://msdn.microsoft.com/en-us/library/d86he86x(v=vs.71).aspx) использует 8 бит памяти.

2 голосов
/ 16 марта 2012

Short - это не байт со знаком, это 16-битное значение со знаком.

 short[] buffer = new short[1024];                
 for (int i = 0; i < 1024; i++) {
     buffer[i] = reader.ReadInt16();
 }
1 голос
/ 16 марта 2012

Вы должны использовать тот же тип данных, чтобы получить правильный вывод или привести к новому типу.

В c ++ вы используете short.(Полагаю, файл также написан с short), поэтому используйте short в c #.или вы можете использовать Sytem.Int16.

Вы получаете разные значения, потому что short и sbyte не эквивалентны.short равен 2 байта, а Sbyte равен 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();
     }                
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...