2014-01-20 6 views
0

Мне нужен мой код, чтобы сделать что-то вроде этого: где-то в коде num получает значение, и после этого я хочу читать из файла ТОЧНО, поскольку байты - это номер num.Как читать UInt32 числа байтов с бинарным считывателем?

Например: Если num is 39382, мне нужно прочитать 39382 байта и поместить их в буфер [];

Перед тем, как что-то вроде этого:

ushort num = 0; 
//.... num get some value; 
byte[] buffer = bRead.ReadBytes(num); 

Теперь я должен изменить его так, что num является UInt32, но ReadBytes не работает (потому что он хочет int32). Возможно, «num» превысит int32. Я зафиксировал это следующим образом:

byte[] buffer = new byte[num]; 
for (int j = 0; j < num; j++) 
{ 
    buffer[j] = bRead.ReadByte(); 
} 

и он работает, но мне интересно, что это лучший способ сделать это? Или есть еще?

+0

Предупреждение: выделение массива> 2 ГБ будет работать только на .NET 4.5 64bit с установкой 'gcAllowVeryLargeObjects' значения true. Возможно, вам захочется работать с «FileStream» или эквивалентом. –

+0

И это одна из причин, по которой я хочу изменить ее с лучшей. – Georgi

ответ

0

Если вы уверены, что Num не будет выходить за рамки int32 максимум вы можете использовать следующее:

UInt32 num = 0; 
//.... num get some value; 
bRead.ReadBytes(checked((int)num)); 

Это будет сгенерировано OverflowException если Num выходит за пределы разрядной макс подписано 32.

+0

Если я знаю, что это не будет превышать значение int32 max, я собираюсь сделать его int. – Georgi

+0

Не могли бы вы добавить эту информацию на свой вопрос? – Vincent

+0

Хорошо, я добавил. – Georgi

0

Вы можете использовать:

public static ushort ToUInt32(
    byte[] value, 
    int startIndex 
) 

вы указываете массив источника и положение, в котором начинается закодированный номер. Если ваш массив байтов содержит один номер, startIndex будет равен 0, а длина должна быть не менее 4.