как проверить строку ruby ​​- это актуальная строка или данные BLOB-объекта, такие как изображение - PullRequest
0 голосов
/ 11 декабря 2010

В ruby, как проверить, является ли строка действительной строкой или данными большого двоичного объекта, такими как изображение, с точки зрения типа данных они являются строкой ruby, но на самом деле их содержимое сильно отличается, так как один является литеральной строкой, а другой - blobтакие данные, как изображение.

Может ли кто-нибудь дать мне подсказку?Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 11 декабря 2010

Байты - это байты. Невозможно объявить, что что-то не является данными файла. Было бы довольно легко создать правильный файл во многих форматах, состоящий только из печатного ASCII. Особенно когда имеешь дело с Unicode, ты на очень темной территории. Если возможно, я бы предложил изменить метод так, чтобы он принимал два параметра ... использовать один для передачи текста, а другой для двоичных данных.

Одна вещь, которую вы можете сделать, это посмотреть на длину строки. Большинство форматов изображений имеют размер не менее 500-600 байт даже для крошечного изображения, и хотя это ни в коем случае не является точным тестом, если вы, например, пройдете строку размером 20 Кб, это, вероятно, изображение. Если бы это был текст, это было бы совсем немного (как четверть типичного романа или около того)

1 голос
/ 11 декабря 2010

Файлы, такие как изображения или звуковые файлы, имеют определенные блоки, которые можно «прослушать». Wotsit.org содержит много информации о ключевых байтах и ​​способах определения файлов. Посмотрев на эти байтовые смещения в ваших данных, вы сможете понять это.

Другим способом является использование некоторого «волшебства», то есть кода, чтобы прослушивать ключевые байты или типы байтов в файле, чтобы попытаться выяснить, каков его тип. В системах * nix это встроено с помощью команды file. Сделайте man file или man magic для получения дополнительной информации или посмотрите статью Википедии о Магические числа в файлах .

Ruby Filemagic использует ту же технику, но основана на libmagic GNU.

0 голосов
/ 11 декабря 2010

Что бы составить строку? Вы ожидаете простой ASCII? UTF-8? Или текст закодирован как-то иначе?

Если вы знаете, что собираетесь получить текст ASCII или большой двоичный объект, тогда вы можете просто прокрутить первые n байты и посмотреть, есть ли у чего-либо установленный восьмибитный бит, который скажет вам, что у вас есть двоичный файл. OTOH, ничего не найдя не гарантирует, что у вас есть текст.

Если вы собираетесь получить Unicode UTF-8, вы должны сделать то же самое, но искать недопустимые последовательности UTF-8. Конечно, применяются те же предостережения.

Вы можете отсканировать первые n байтов для любых значений от 0x00 до 0x20. Если вы найдете какой-либо младший байт, то у вас, вероятно, есть двоичный двоичный объект. Но, возможно, нет.

Как сказал Тайлер Ивс: байты - это байты. Вы начинаете с нескольких байтов и пытаетесь найти их толкование, которое имеет смысл.

Лучше всего сделать так, чтобы вызывающий абонент предоставил ожидаемую интерпретацию или воспользовался советом Грега и использовал библиотеку магических чисел.

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