Я пытаюсь создать свою собственную функцию c btoi(char *str, int base)
, которая может принимать любое число от 2 до 64. Однако, немного почитав, я понимаю, что, возможно, открываю большую банку с червями.
Я говорю это потому, что алфавиты binary
,octal
,decimal
,hexadecimal
,base-32
и base-64
либо универсальны, либо четко определены в rfc4648.
Однако, несмотря на мое первоначальное предположение, что все, что до основания 62, будет продолжением алфавита 0-9
+ A-Z
+ a-z
, чтение раздела-7 rfc4648 меня озадачило, поскольку «обычное» основание 32 — это A-Z
+ 2-7
.
Чтобы еще больше усложнить ситуацию, у нас также есть проблема с заполнением.
Мой вопрос: существует ли стандартизированный способ преобразования строки в целое число в любой базе (до 64)?
Или я хочу это реализовать?
Нет, стандартизированного способа преобразования строки в целое число в любой базе не существует. Даже обычные числа с основанием 10 можно преобразовать в строку в разных формах: "42"
на английском языке "٤٢"
(или наоборот) на арабском языке или любом другом!
Предположительно, входная строка находится в любой базе, кроме int
.
Двоичные, восьмеричные, десятичные, шестнадцатеричные и другие целочисленные представления в любой системе счисления не имеют ничего общего со схемами кодирования данных по основанию 32 или 64.
Re «Мой вопрос: существует ли стандартизированный способ преобразования строки в целое число в любой системе счисления (до 64)? Или я хочу это реализовать?»: (а) Стандарт — это просто спецификация, которую решили использовать несколько человек. Стандарты, определяющие единственный способ сделать что-то, — это здорово, поэтому у нас их много, и вы можете выбрать, какой из многих способов выбрать. (б) Стандарт, на который вы ссылаетесь, даже не определяет один способ кодирования по базе 64, поскольку показывает два разных варианта. с) стандарты не являются законами; даже если есть стандарт, вы можете сделать это так, как захотите.
Другой пример: BIP39 преобразует 11-битные значения (от 0
до 2047
) в слово (надеюсь, на английском языке, но доступно множество языков); обычно используется с 12 или 24 словами для крипто-сидов.
Вы неправильно понимаете, для чего нужен RFC4648.
Он не указывает, какие символы следует использовать для чисел в системе счисления 16, 32 и 64. Он показывает три различных способа кодирования двоичных данных в тексте ASCII.
В случае base64 он принимает 3 8-битных значения, обрабатывает их как 4 6-битных значения, а затем выводит символы ASCII. Ниже приведен пример из RFC:
Input data: 0x14fb9c03d97e
Hex: 1 4 f b 9 c | 0 3 d 9 7 e
8-bit: 00010100 11111011 10011100 | 00000011 11011001 01111110
6-bit: 000101 001111 101110 011100 | 000000 111101 100101 111110
Decimal: 5 15 46 28 0 61 37 62
Output: F P u c A 9 l +
Выше показано, как значения байтов 0x14 0xfb 0x9c 0x03 0xd9 0x7e преобразуются в строку ASCII FPucAgl+
.
Что касается того, какой алфавит считается стандартным для чисел с основанием 2–36, наиболее распространенным является 0–9 для значений 0–9, а также a–z и A–Z для значений 10–35 (т. е. без учета регистра).
Стандартная библиотечная функция strtol
уже существует, которая сделает это за вас.