Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Избавиться от предупреждения  (Прочитано 12055 раз)
0 Пользователей и 1 Гость смотрят эту тему.
vika
Постоялец

ru
Offline Offline
Пол: Женский

« : 09-12-2012 21:57 » 

Собственно, здравствуйте. Заранее извиняюсь, если кому-то уже надоела, но тем не менее, прошу помощи...
Дело то вот в чем. Понадобилось раскодировать base64, стандартный mime:base64 не раскодировал толком utf-8, мучилась с encode, decode, в результате плюнула и написала небольшую функцию для раскодировки base64 (по аналогии с javascript)
Код: (Perl)
sub base64decode {

my ($str) = @_;
             
$b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
$b64decoded = '';

for ($i = 0; $i < length $str;) {
$enc1 = index ($b64chars,substr($str, $i++, 1));
$enc2 = index ($b64chars,substr($str, $i++, 1));
$enc3 = index ($b64chars,substr($str, $i++, 1));
$enc4 = index ($b64chars,substr($str, $i++, 1));

$chr1 = ($enc1 << 2) | ($enc2 >> 4);
$chr2 = (($enc2 & 15) << 4) | ($enc3 >> 2);
$chr3 = (($enc3 & 3) << 6) | $enc4;

$b64decoded = $b64decoded . chr($chr1);

if ($enc3 < 64) {
$b64decoded .= chr($chr2);
}

if ($enc4 < 64) {
$b64decoded .= chr($chr3);
}
}
return $b64decoded;
}

При использовании опции -w, перл недовольно ворчит предупреждением, дескать, вот тут
Код: (Perl)
$enc4 = index ($b64chars,substr($str, $i++, 1));
мы вышли за строку. Как так, ума не приложу, хотя скрипт отрабатывает, как надо. Подскажите, в чем дело, пожалуйста.
« Последнее редактирование: 11-12-2012 08:28 от Sel » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 10-12-2012 03:59 » 

По моему диагноз ясен. Твой код не будет выдавать предупреждение только с входной строкой кратной четырем.

Нет, не надоела, но грустно смотреть на такое. Руки надо выпрямлять, а голову — просвещать!
Может лучше вернемся к «стандартный mime:base64 не раскодировал толком utf-8» и «мучилась с encode, decode» — это куда более интересная тема?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
vika
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #2 : 10-12-2012 09:54 » new

По моему диагноз ясен. Твой код не будет выдавать предупреждение только с входной строкой кратной четырем.
Странно, в дваскрипте такого нету. Хотя, этот мой "быдлокод" неплохо выполняет свою задачу, а прагму -w можно и отключить

Нет, не надоела, но грустно смотреть на такое. Руки надо выпрямлять, а голову — просвещать!
Может лучше вернемся к «стандартный mime:base64 не раскодировал толком utf-8» и «мучилась с encode, decode» — это куда более интересная тема?
Спасибо, толкьо стандартный base64 почему то упорно не работает c utf8, толком объяснений нет нигде, вот и пришлось изворачиваться...
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 10-12-2012 10:05 » 

Давай теперь подробно разберем. От тебя нужно:

1. Код с mime:base64.
2. Пример входной строки.
3. Пример выходной строки, как она у тебя получается.
4. Пример выходной строки, как ты ее ожидаешь видеть.
« Последнее редактирование: 10-12-2012 10:07 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 10-12-2012 13:01 » 

RXL, я посчитал, там 64 символа, может я ошибся..
Тут вопрос тогда след
for ($i = 0; $i < length $str;) {
$enc1 = index ($b64chars,substr($str, $i++, 1));
Здесь чему i равно
$enc2 = index ($b64chars,substr($str, $i++, 1));
А здесь?
$enc3 = index ($b64chars,substr($str, $i++, 1));
А здесь?

$enc4 = index ($b64chars,substr($str, $i++, 1));
А здесь?

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines