Есть ли способ хранить произвольно большой бигиту в немного последовательности, только позже, чтобы преобразовать его в стандартную структуру Bigint?
-
29-09-2020 - |
Вопрос
Я пытаюсь представить себе способ кодирования бигинта в немного поток, чтобы он был буквально просто последовательностью битов.Затем при декодировании этого потока битов вы будете генерировать стандартную структуру данных BIGINT в виде данных (массив мелких целых чисел со знаком).Как вы могли бы кодировать бигиту как последовательность битов, и как бы вы его декодировали?Я не вижу, как правильно выполнять побитовые манипуляции или как кодировать произвольное число в битах более 32 или 64. Если требуется язык, я бы сделал это в JavaScript.
Например, это принимает байты и преобразует его в один битовый поток:
function arrayOfBytesTo32Int(map) {
return map[0] << 24
| map[1] << 16
| map[2] << 8
| map[3]
}
.
Как бы вы сделали эту же вещь для произвольно длинных последовательностей?
Решение
Посмотрите на Delta или гамма-кодирование Elias в качестве примера.
Другие советы
Есть Многие распространенные кодировки для целых чисел произвольной длины. Я бы сказал, что наиболее используемые представления:
- .
- Представления данных - данные, где число байтов / слов записывается первым, а затем данные.
- «Продолжение бита» представление. Если размер слов B Bits, то целое число разделено на группы битов B-1 , с битом высокого порядка, обозначающей, есть ли другой байт или нет.
Вы можете смешивать и сочетать их. Асн.1 Основные правила кодирования Чехол в точке, где в общем случае поле длины кодируется в базе 128, используя бит продолжения. ASN.1 BER используется во многих сетевых протоколах, таких как VoIP, SNMP и LDAP, а также в Криптография , где представляют большие целые числа - это общее.