Как правильно прочитать 16-байтовое целое число без знака с помощью BinaryReader - PullRequest
3 голосов
/ 09 июня 2010

Мне нужно проанализировать двоичный поток в .NET для преобразования 16-байтового целого числа без знака. Я хотел бы использовать функции BinaryReader.ReadUIntXX (), но функции BinaryReader.ReadUInt128 () нет. Я предполагаю, что мне придется свернуть свою собственную функцию с использованием функции ReadByte и построить массив, но я не знаю, является ли это наиболее эффективным методом? Спасибо!

Ответы [ 3 ]

2 голосов
/ 09 июня 2010

Я хотел бы взять кредит на это, но один быстрый поиск в сети, и альт:

http://msdn.microsoft.com/en-us/library/bb384066.aspx

Вот пример кода (который находится на той же странице)

byte[] bytes = { 0, 0, 0, 25 };

// If the system architecture is little-endian (that is, little end first),
// reverse the byte array.
if (BitConverter.IsLittleEndian)
    Array.Reverse(bytes);

int i = BitConverter.ToInt32(bytes, 0);
Console.WriteLine("int: {0}", i);
// Output: int: 25

Единственное, чего не знает большинство разработчиков, - это различие между порядком байтов и порядком байтов.Как и большинство вещей в жизни, человеческая раса просто не может договориться об очень простых вещах (хороший пример - левая и правая машины).Когда биты (помните 1 и 0 и двоичную математику), выложены, порядок битов будет определять значение поля.Один байт - это восьмые биты ... затем он подписан и не подписан ... но давайте придерживаться порядка.Число 1 (один) может быть представлено одним из двух способов: 10000000 или 00000001 (подробное объяснение см. В пояснениях в комментариях) - как следует из комментария в коде, старшим номером является тот, в котором спереди стоит один, маленький-эндиан это тот, с нуля.(см. http: // en.wikipedia.org/wiki/Endianness - извините нового пользователя, и они не дадут мне гиперссылку более одного раза ....) Почему мы не можем просто согласиться ???

Я усвоил этот урок много лет назад, когда имел дело со встроенными системами .... помните ссылки?:) Я показываю свой возраст ??

1 голос
/ 12 июня 2010

Я думаю, что комментарии от 0xA3, SLaks и Дарина Димитрова ответили на вопрос, но, чтобы сложить все вместе.BinaryReader.ReadUInt128 () не поддерживается классом двоичного чтения в .NET, и единственное решение, которое я смог найти, - это создать собственную функцию.Как уже упоминалось 0xA3, в .NET 4.0 существует тип данных BigInt.Я нахожусь в процессе создания своей собственной функции, основанной на комментариях каждого.Спасибо!

0 голосов
/ 09 июня 2010

размер направляющей - ровно 16 байт.

Guid guid = новый Guid (byteArray);

Но вы не можете делать математику с Guid. Если вам нужно, вы можете найти в Интернете некоторые реализации BigInteger для .net. Затем вы можете конвертировать ваш bytearray в BigInteger.

...