base64 и integer

iceman

говнокодер
по алгоритму base64 (http://www.delphikingdom.com/asp/viewitem.asp?catalogid=691)

есть int = 3001
hex: 00000BB9 или по байтам 0x00 0x00 0x0B 0xB9
bin: 00000000 00000000 00001011 10111001
6bit: 000000 000000 000000 001011 101110 010000
dec: 0 0 0 11 46 16
base64: A A A L u Q = =

в принципе функция мне это выводит (язык pl/sql)

НО, есть ТЗ где сказано:
...Затем это число (наш int 3001) представляется в 64-ичной системе счисления с использованием модифицированного кода BASE 64, у которого строчные латинские буквы заменены на прописные русские. Кодовая таблица представлена в табл.1
В общем если опустить эту кодовую таблицу и смотреть стандартную base64, то по примеру в ТЗ, должно быть так: 3001 => u5 (0x2E 0x39)

как так? что я делаю не правильно или это ошибка в ТЗ?
 

WMix

герр M:)ller
Партнер клуба
если я правильно понял, то все что нужно сделать это.
PHP:
function TZ($str, $to){
    $str = base64_encode($str);
    $from = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
    for($i=0; $i<strlen($from); $i++ ){
        $str = str_replace( $from[$i], $to[$i], $str );
    }
    return $out;
}
$to = 'твоя таблица';
echo TZ(3001, $to);
 

iceman

говнокодер
WMix
ну это как раз про замену в кодовой таблице, это понятно, у них вообще результат "ЛЦ", а аналогия в base64 это "u5", но base64_encode($str) уже вернет AAALuQ== 6 байтов против 2х по ТЗ
 

WMix

герр M:)ller
Партнер клуба
3001 это инт а php обрабатывает его как str в этом ошибка наверно и тебе придется переписать base64_encode ну или 3001 представить 2мя непонятными chars
 
Последнее редактирование:

iceman

говнокодер
WMix
ДА не, дело не в ПХП даже, я делаю на бумажке.

есть int = 3001
hex: 00000BB9 или по байтам 0x00 0x00 0x0B 0xB9
bin: 00000000 00000000 00001011 10111001
6bit: 000000 000000 000000 001011 101110 010000
dec: 0 0 0 11 46 16
base64: A A A L u Q = =
протестил на pl/sql, там я явно передаю 4 байта 0x00 0x00 0x0B 0xB9 и в ответ получаю тоже самое, что и на бумажке.
 

WMix

герр M:)ller
Партнер клуба
PHP:
echo base64_encode(sprintf("%c",3001)); //uQ== хм "u5" не получилось
echo base64_encode("3001"); // MzAwMQ==
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
если делать по твоему
3001(10) = 101110111001(2) = [46,57] = ".9"
 

iceman

говнокодер
в общем одну сторону я понял.

3001 занимает по сути 2 байта 0x0B и 0xB9

для кодирования нам нужна группа из 3х байт, по идеи "="
получаем bin: 00000000 00001011 10111001
6bit: 000000 000000 101110 111001
dec: 0 0 46 57
base64: u5=
 

WMix

герр M:)ller
Партнер клуба
открыл калькулятор вбил 3001 и переключил на bin далее каждые 6 символов с конца переводил в dec
PHP:
echo decbin(3001);
//101110111001
echo bindec('111001');
//57
echo bindec('101110');
//46
 

iceman

говнокодер
все оказалось проще
3001/64 = 46 - первый символ
3001 - 46*64 = 57 - второй.

бугогашеньки!
 
  • Like
Реакции: WMix
Сверху