Аватар для 0LyBmW2DEE
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 11

Вариативная длина числа

11.04.2016, 06:42. Показов 1368. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте
Есть такое понятие Variable-length quantity
Вот еще информация на гугле

Собственно вопрос, как из последовательности байт (массив или поток, не важно) считать мне число вариотивной длины?

По пояснением из гугла и википедии понятно что нужно читать первый байт, раскладывать его на биты и смотреть первый бит, если он равен единицы, значит следующий байт в массиве это продолжение числа.
И тут уже возникла трудность, по описанию я понял, что первый бит всегда будет отсекаться, так как он в числе не участвует?

На гугле указан пример с числом 300:

А вот 300 – это немного сложнее:

1010 1100 0000 0010
Как понять, что это 300? Первый упаду старший бит из каждого байта, а это только там, чтобы сказать нам, правильно ли мы достигли конца числа (как видите, она находится в первом байте как есть больше чем один байт в варинт):

1010 1100 0000 0010
→ 010 000 0010 1100
Отменить две группы из 7 битов, поскольку, как вы помните, varints хранить числа с не менее значительной группы первых. Тогда вы объединить их, чтобы получить окончательное значение:

010 000 0010 1100
→ ++ 010 000 0010 1100
→ 100101100
→ 256 + 32 + 8 + 4 = 300
(переводил яндекс переводчиком)

С этим не понятно только как они из "→ ++ 010 000 0010 1100" получили "→ 100101100"

Также я читал что вариативное число это сериализованное число библиотекой protobuf-net и что можно создать класс и десериализовать поток байт в него. Но, я не знаю как это адекватно реализовать, да и метод не совсем подходит.

Что бы понять какой именно первый бит в числе (1 или 0) достаточно сделать так:
C#
1
2
int i = 300;
bool j = (i & 128) == 0 ? false : true;
И на википедии есть примеры чисел
IntegerVariable-length quantity
0x000000000x00
0x0000007F0x7F
0x000000800x81 0x00
0x000020000xC0 0x00
0x00003FFF0xFF 0x7F
0x000040000x81 0x80 0x00
0x001FFFFF0xFF 0xFF 0x7F
0x002000000x81 0x80 0x80 0x00
0x080000000xC0 0x80 0x80 0x00
0x0FFFFFFF0xFF 0xFF 0xFF 0x7F
Получить их мне так и не удалось. Помогите пожалуйста понять, либо реализовать преобразование чисел =\
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2016, 06:42
Ответы с готовыми решениями:

Длина входного массива больше числа столбцов в этой таблице
Имеем такой код и в указанной строке выдает "проблему" - длина входного массива больше числа столбцов в этой таблице. Что я делаю не...

Ошибка: Длина входного массива больше числа столбцов в этой таблице
подскажите в чём ошибка при запуске мне выдаёт "Длина входного массива больше числа столбцов в этой таблице." string pers = {...

Число вводится своим двоичным представлением (длина числа не превышает 10000 двоичных разрядов)
Число вводится своим двоичным представлением (длина числа не превышает 10000 двоичных разрядов) Необходимо определить, делиться ли число на...

3
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
11.04.2016, 07:42
Есть же множество библиотек для работы с protobuf, в них есть готовые классы для чтения типов данных, использумых protobuf, вот например метод чтения в одной из них TryReadUInt64VariantWithoutMoving или ReadRawVarint32
1
298 / 260 / 108
Регистрация: 26.10.2012
Сообщений: 810
11.04.2016, 08:30
Лучше смотреть на рисунок в википедии, там яснее. Зачем в таблице представлены числа в 16-чной системе счисления, когда используется двоичная -хз.
Смотри, число записывается в двоичной системе 0x00000080 = 8 * 16 = 128 = 10000000 затем оно разбивается в двоичной записи на группы по 7 цифр 10000000 это 00000001 и 0000000. Эти группы кодируются в байт. Число кодируется в несколько таких байтов. В байте 7 битов кодируют 7 0-1 цифр группы, кроме того , так как групп по 7 цифр в числе несколько, нужно еще в одном бите закодировать, последняя ли это группа битов или нет. Если группа последняя то в этот бит ставится 0, иначе 1.
То есть к группам
0000001 и 0000000 приписываются биты 1 и 0 (0 приписывается только к самой правой, последней группе, иначе - 1) Получаются биты
10000001 00000000
Т.е каждые 7 знаков числа шифруются 1 байтом по 8 бит
1
 Аватар для 0LyBmW2DEE
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 11
14.04.2016, 05:58  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Есть же множество библиотек для работы с protobuf, в них есть готовые классы для чтения типов данных, использумых protobuf, вот например метод чтения в одной из них TryReadUInt64VariantWithoutMoving или ReadRawVarint32
Спасибо. По первой ссылке мне синтаксис не знаком. По второй ссылке, понял как это все реализовать, только с порядок действий логических операций там не правильный изменить пришлось.

Добавлено через 1 минуту
jetyb, спасибо, разобрался с принципом

Добавлено через 6 часов 25 минут
Что бы не быть голословным в заявлении "не правильный порядок действий"
В C#
Если делать по примеру:
C#
1
2
3
int t = 1;
t |= 0 << 7;
Console.WriteLine(t);
Так не будет работать, вот вот правильный вариант:
C#
1
2
3
int r = 1;
r = r << 7 | 0;
Console.WriteLine(r);
Это я часть из кода выдрал с заготовленными значениями.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.04.2016, 05:58
Помогаю со студенческими работами здесь

вариативная часть струкуры
Помогите, пожалуйста, как разработать структуру с вариативной частью для представления информации о классе (различать девушек и мальчиков)...

Длина числа до возведения в степень
Есть например 3^9 = 19683. Длина равна 5. Как определить эту длину не возводя само число в степень?

Длина числа возведнного в степень
Как определить сколько цифр будет в результате возведения а в степень х? Нужно отфильтровать числа, результат возведения в степень...

Длина окружности, натуральные числа, графики функций
Здравствуйте уважаемые форумчани, чесно признаюсь я не знаток matlab, буду очень признателен за помощь в нижее следуемых задачах: 1....

Прибавить 1 к целому числу N (длина числа N до 1000 знаков)
Задача в том , чтобы прибавить 1 к числу. попробовал сделать через строку, но если в конце числа девятки , то ответ получится...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru