Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для 0LyBmW2DEE
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 11

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

11.04.2016, 06:42. Показов 1337. Ответов 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,573
11.04.2016, 07:42
Есть же множество библиотек для работы с protobuf, в них есть готовые классы для чтения типов данных, использумых protobuf, вот например метод чтения в одной из них TryReadUInt64VariantWithoutMoving или ReadRawVarint32
1
289 / 252 / 107
Регистрация: 26.10.2012
Сообщений: 802
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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru