У меня есть приложение 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) вызывает потерю точности.
Стремится услышать любые идеи, готов попробовать что угодно, чтобы проверить предложения. Спасибо.