Чтение из / запись в байтовые массивы в C # .net 4 - PullRequest
1 голос
/ 29 апреля 2011

Привет Переливы,

Мне нравится гибкость отображаемых в памяти файлов, так как вы можете читать / записывать любые типы значений.
Есть ли способ сделать то же самое с байтовыми массивами без необходимости копировать их, например, для буферы карты памяти?

Привет

Ответы [ 4 ]

6 голосов
/ 29 апреля 2011

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

Вы можете читать значения непосредственно из массива:

int value = BitConverter.ToInt32(data, pos);

Для записи данных вы конвертируете их в байтовый массив и копируете в данные:

BitConverter.GetBytes(value).CopyTo(data, pos);
4 голосов
/ 29 апреля 2011

Вы можете связать MemoryStream с данным байтовым массивом, установить его свойство Position, чтобы перейти к определенной позиции в массиве, а затем использовать BinaryReader или BinaryWriter для чтения / записи значений различных типов из / в него.

1 голос
/ 29 апреля 2011

Вы ищете класс MemoryStream, который можно инициализировать (без копирования!) Из байтового массива фиксированного размера.

0 голосов
/ 11 апреля 2018

(с использованием небезопасного кода). В следующем примере показано, как заполнить 16-байтовый массив двумя длинными значениями, что BitConverter все еще не может сделать без дополнительной операции копирования:

byte[] bar = new byte[16];
long lValue1 = 1;
long lValue2 = 2;
unsafe {
    fixed (byte* bptr = &bar[0]) {
        long* lptr = (long*)bptr;
        *lptr = lValue1;
        // pointer arithmetic: for a long* pointer '+1' adds 8 bytes.
        *(lptr + 1) = lValue2;
    }
}

Или выможет создать собственный метод StoreBytes ():

// here the dest offset is in bytes
public static void StoreBytes(long lValue, byte[] dest, int iDestOffset) {
    unsafe {
        fixed (byte* bptr = &dest[iDestOffset]) {
            long* lptr = (long*)bptr;
            *lptr = lValue;
        }
    }
}

Считывание значений из байтового массива не является проблемой для BitConverter, поскольку вы можете указать смещение в .ToInt64.

Альтернатива: использовать Buffer.BlockCopy, который может конвертировать типы массивов.

...