Можно ли использовать Mono DataConvert для чтения 3-байтового целого числа? - PullRequest
1 голос
/ 17 февраля 2012

Я пытаюсь прочитать конкретный двоичный файл, но он содержит 3-байтовые целые числа с прямым порядком байтов.Я недавно сталкивался с Mono DataConvert , что должно быть хорошо для большинства того, что я хочу, за исключением этих 3-байтовых целых чисел.Я не уверен, как их читать.Обратите внимание, что мне не нужно хранить их как 3-байтовые целые числа, чтение их в обычном Int32 было бы идеальным.Я читаю большую часть данных, поэтому я ищу что-то эффективное.Любые предложения?


Пример идеального кода:

public Region(string regionFile)
{
    var conv = DataConverter.BigEndian;
    var chunks = new Chunk[Chunk.MaxLocations];
    using (var fs = File.OpenRead(regionFile))
    {
        var buffer = new byte[4096];
        fs.Read(buffer, 0, buffer.Length);

        // Read chunk locations
        for (int i = 0; i < Chunk.MaxLocations; ++i)
        {
            chunks[i] = new Chunk(conv.ToInt24(buffer, i * 4), buffer[i * 4 + 3]);
        }
    }
}

Я хочу сделать что-то подобное, кроме conv.ToInt24 не существует.Я думаю, я мог бы написать свой, сдвигая биты ...

1 Ответ

0 голосов
/ 17 февраля 2012

Я скопировал Mono's GetInt32 и слегка его изменил:

public override int GetInt24(byte[] data, int index)
{
    if (data == null)
        throw new ArgumentNullException("data");
    if (data.Length - index < 3)
        throw new ArgumentException("index");
    if (index < 0)
        throw new ArgumentException("index");

    int ret = 0;
    byte* b = (byte*)&ret;

    for (int i = 0; i < 3; i++)
        b[2 - i] = data[index + i];

    return ret;
}

Кажется, работает.

...