Как я могу проверить значение Base64 на целое число?

Можно попробовать

find . -maxdepth 1 -print0 | xargs -I '{}' -r0 mv '{}' ..

который перезапишет файлы простофили в..

Можно использовать mv-u '{}', чтобы не перезаписать если простофиля в.. то же или более новый

2
08.11.2010, 01:42
2 ответа

Преобразуйте число в шестнадцатеричное число, чем использование echo распечатать согласно последовательности байта и каналу это в base64. Таким образом для кодирования целого числа 10 base64 можно использовать:

echo -en '\xA' | base64

Объяснить результат. Байт 10 имеет следующее двоичное представление:

00001010

То, что делает base64, он разделяет на блоки base64 в группы 6 битов. Таким образом с дополнением мы получаем следующие два 6lets:

000010 100000

Которые в десятичном числе равняются 2 и 32, которые соответствуют буквам C и g.

4
27.01.2020, 22:01
  • 1
    Спасибо, но я думаю, что получаю неправильный результат. Я добираюсь Cg== где C=2 и g=32 согласно Википедии, почему это? Не был должен это быть K и возможно некоторое дополнение ==? И единственное число в основе 10 должно быть только одним числом/буквой в основе 64. –  Jonas 24.10.2010, 19:31
  • 2
    @Jonas: Нет, это - точно правильный результат. Посмотрите мое объяснение. –  sepp2k 24.10.2010, 19:37
  • 3
    Спасибо за объяснение. Я понимаю это теперь. Но как я могу проверить Base64 на число, не используя двоичное представление, которое используется компьютерами (всегда 32 бита), например, использование 4 бита для номера десять и никакого дополнения. Возможно, это не возможно с base64 команда. Таким образом 10 должен быть K. Я попробовал echo -en '\b1010' | base64 но это не работало. –  Jonas 24.10.2010, 19:52
  • 4
    я имею в виду base64 реализацию, на которую ссылаются как base64url на Википедию. Но я предполагаю, что это не доступно как команда в Bash. Таким образом, я, вероятно, должен найти его где-нибудь или реализовать его сам. Спасибо так или иначе. –  Jonas 24.10.2010, 20:11
  • 5
    @Jonas: Да, Вы не можете действительно сделать этого. Не возможно создать файл, это составляет большой меньше чем один байт (или запись меньше чем один байт к потоку, или передайте число, это составляет меньше чем один байт, большой к функции в C - все составляет по крайней мере один байт в компьютере). То, что можно сделать, сместить число два бита налево и затем назвать base64 на этом. Это даст Вам два 6lets, последний которого будет 0 и первый будет числом, которое Вы хотите. –  sepp2k 24.10.2010, 20:14

Приведенная ниже команда преобразует десятичное целое число в радикс 64. Она не использует схему кодирования Base64, но использует символы, используемые URL-safe вариантом схемы кодирования Base64 в качестве цифр.

awk 'NR==FNR{a[NR-1]=$0;next}{if($0==0){print "A";next}o="";for(n=$0;n!=0;n=int(n/64))o=a[n%64]o;print o}' <(printf %s\\n {A..Z} {a..z} {0..9} - _) -

Команда ниже делает то же самое в Bash. Она также работает в Zsh, если заменить l%64 на l%64+1.

unset a;a=({A..Z} {a..z} {0..9} - _);while IFS= read l;do if ((l==0));then echo A;continue;fi;o=;for ((;l! =0;l/=64));do o=${a[l%64]}$o;done;printf %s\\\\n "$o";done

Это конвертирует радикс 64 в десятичную систему:

awk 'NR==FNR{a[$0]=NR-1;next}{o=0;for(i=NF;i>=1;i--)o+=a[$i]*64^(NF-i);print o}' FS= <(printf %s\\\\n {A. .Z} {a..z} {0..9} - _) -

Это делает то же самое в Bash:

unset a;i=0;declare -A a;for x in {A..Z} {a..z} {0..9} - _;do a[$x]=$((i++));done;while IFS= read l;do o=0;for((i=${#l};i>=1;i--));do let o+=${a[${l:i-1: 1}]}*64**(${#l}-i);done;echo "$o";done

Команды awk приводят к потере точности с 2**53+1 и большими числами, но чтобы избежать этого, можно добавить -M (--bignum) в gawk 4. 1 и более поздних версиях.

Команды Bash приводят к целочисленному переполнению при 2**63 и больших числах.

0
27.01.2020, 22:01

Теги

Похожие вопросы