Существует ли стандартизированный способ преобразования строки в целое число в любой базе?

Я пытаюсь создать свою собственную функцию 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)?
Или я хочу это реализовать?

en.cppreference.com/w/c/string/byte/strtol до базы 36
Joel 02.09.2024 21:01

Нет, стандартизированного способа преобразования строки в целое число в любой базе не существует. Даже обычные числа с основанием 10 можно преобразовать в строку в разных формах: "42" на английском языке "٤٢" (или наоборот) на арабском языке или любом другом!

pmg 02.09.2024 21:07

Предположительно, входная строка находится в любой базе, кроме int.

Weather Vane 02.09.2024 21:13

Двоичные, восьмеричные, десятичные, шестнадцатеричные и другие целочисленные представления в любой системе счисления не имеют ничего общего со схемами кодирования данных по основанию 32 или 64.

Andrew Henle 02.09.2024 21:14

Re «Мой вопрос: существует ли стандартизированный способ преобразования строки в целое число в любой системе счисления (до 64)? Или я хочу это реализовать?»: (а) Стандарт — это просто спецификация, которую решили использовать несколько человек. Стандарты, определяющие единственный способ сделать что-то, — это здорово, поэтому у нас их много, и вы можете выбрать, какой из многих способов выбрать. (б) Стандарт, на который вы ссылаетесь, даже не определяет один способ кодирования по базе 64, поскольку показывает два разных варианта. с) стандарты не являются законами; даже если есть стандарт, вы можете сделать это так, как захотите.

Eric Postpischil 02.09.2024 21:18

Другой пример: BIP39 преобразует 11-битные значения (от 0 до 2047) в слово (надеюсь, на английском языке, но доступно множество языков); обычно используется с 12 или 24 словами для крипто-сидов.

pmg 02.09.2024 21:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы неправильно понимаете, для чего нужен 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 уже существует, которая сделает это за вас.

Другие вопросы по теме