Распаковка двоичного двоичного объекта ActiveRecord в шестнадцатеричную строку удаляет управляющие символы («% 25» преобразовано в «%») - PullRequest
0 голосов
/ 12 мая 2011

У меня есть приложение Ruby-on-Rails, которое принимает загрузку двоичного файла, сохраняет его как объект ActiveRecord в локальной базе данных и передает шестнадцатеричный эквивалент двоичного двоичного объекта во внутренний веб-сервис для обработки. Это обычно прекрасно работает.

Два дня назад я столкнулся с проблемой с файлом, содержащим шестнадцатеричную последовательность \x25\x32\x35, %25 в ASCII. Двоичное представление файла должным образом сохранено в базе данных, но шестнадцатеричное представление файла, полученное в результате

sample.binary.unpack('H*').to_s

было неверно. После исследования я обнаружил, что эти три байта были преобразованы в шестнадцатеричную строку 25, представляющую собой %. Это должно было быть 253235, представление для %25

Для Ruby, Rails или ActiveRecord имеет смысл сделать это. %25 является правильным значением в кодировке URL для %. Тем не менее, мне нужно отключить эту оптимизацию или проверку или что-то еще. Мне нужно blob.unpack('H*'), чтобы включить шестнадцатеричный эквивлант для каждого байта блоба.

Один (неэффективный) способ решить эту проблему - сохранить шестнадцатеричное представление файла в базе данных. Захват файла напрямую из HTTP-запроса POST работает нормально:

params[:sample].read.unpack('H*').to_s 

Это хранит полный 253235. Кое-что об обратном обращении к базе данных (sqlite) или публикации HTTPClient от интерфейсного веб-сервиса к фоновому веб-сервису (размещенному в WEBrick) вызывает потерю точности.

Стремится услышать любые идеи, готов попробовать что угодно, чтобы проверить предложения. Спасибо.

1 Ответ

0 голосов
/ 26 августа 2011

Это известная проблема с rails и адаптером sqlite:

В старой системе rails (здесь с патчем) подана ошибка: https://rails.lighthouseapp.com/projects/8994/tickets/5040

И новая ошибкаподано здесь в новой системе отслеживания проблем рельсов: https://github.com/rails/rails/issues/2407

Любая строка, содержащая «% 00», будет искажена при преобразовании в двоичный файл и обратно.Двоичный файл, содержащий строку «% 25», будет преобразован в «%», что вы и видите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...