Создание типа данных из битов без октетов - PullRequest
1 голос
/ 19 октября 2011

Я разработал собственный формат файла / сетевое сообщение, чтобы максимально уменьшить его размер, но я не знаю, как это реализовать. Любые хедз-апы будут полезны.

Первые 2 байта соответствуют 2 числам в диапазоне от 0 до 63, поэтому я использую 6 бит. В оставшихся 4 битах я храню другое число от 0 до 15.

Так, например, если у меня есть числа 34 , 25 и 15 , биты будут выглядеть так:

34---|25----|15--
10001001 10011111

Я просмотрел BitArray и BitConverter , но я нашел функции для работы с 8-битными, 16-битными и 32-битными типами, а не с пользовательскими.

Конечно, полный формат намного длиннее, но если я пойму это, я думаю, что смогу продолжить.

У кого-нибудь есть совет или может дать мне подсказку, чтобы начать это?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

Боюсь, вы сами должны написать свой код для манипуляции с битами.В вашем примере код будет выглядеть примерно так:

int a = 34;
int b = 25;
int c = 15;

byte[] data = new byte[2];

// Store to byte array
data[0] = (byte)((a << 2) + (b >> 4));
data[1] = (byte)((b << 4) + c);

// Read from byte array
a = data[0] >> 2;
b = ((data[0] & 3) << 4) + (data[1] >> 4);
c = data[1] & 15;

Console.WriteLine("a = " + a); // 34
Console.WriteLine("b = " + b); // 25
Console.WriteLine("c = " + c); // 15

Можно использовать операторы сдвига битов (<< и >>) и операторы логических битов (| и &) манипулировать битами.

1 голос
/ 19 октября 2011

Я просмотрел BitArray и BitConverter, но нашел функции для работать с 8-битными, 16-битными и 32-битными типами, а не с пользовательскими.

Вы должны будете написать свои собственные функции. Я бы просто посоветовал структуру вместо этого. Затем вы можете отправлять X байтов, читать и анализировать эти байты в своей структуре, и вам не придется беспокоиться о написании собственных методов.

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

...