2011-10-01 14 views
5

W konkretnej aplikacji Railsowej, wyciągam dane binarne z LDAP do zmiennej do przetworzenia. Czy istnieje sposób sprawdzenia, czy zmienna zawiera dane binarne? Nie chcę kontynuować przetwarzania tej zmiennej, jeśli nie jest ona binarna. Spodziewam się użyć is_a? ...Szyny: możliwe sprawdzenie, czy ciąg znaków jest binarny?

W rzeczywistości dane binarne, które wyciągam z LDAP, są zdjęciami. Więc może istnieje jeszcze lepszy sposób na zapewnienie, że zmienna zawiera binarne dane JPEG? Wynik tego sprawdzenia określa, czy kontynuować przetwarzanie danych JPEG, czy też renderować domyślny JPEG z dysku.

Odpowiedz

2

Na to pytanie jest znacznie więcej, niż mogłoby się wydawać. Dopiero od Ruby 1.9 istniała koncepcja znaków (w niektórych kodowaniach) w stosunku do surowych bajtów. Tak więc w Rubim 1.9 możesz odejść z prośbą o kodowanie. Ponieważ dostajesz rzeczy z LDAP, kodowanie nadchodzących napisów powinno być dobrze znane, najprawdopodobniej ISO-8859-1 lub UTF-8.

W takim przypadku można uzyskać kodowanie i działają na tym:

some_variable.encoding # => when ASCII-8BIT, treat as a photo 

Skoro naprawdę chcesz sprawdzić, czy dane binarne to zdjęcie, to jest sens, aby uruchomić go za pośrednictwem biblioteki obrazów. RMagick przychodzi na myśl. documentation pokaże ci, jak sprawdzić, czy jakiekolwiek dane binarne są w rzeczywistości zakodowane w formacie JPEG. Będziesz także mógł przechowywać inne właściwości, takie jak szerokość i wysokość.

Jeśli nie masz zainstalowanego RMagick, alternatywnym podejściem byłoby zapisanie danych w pliku Temp, zejście do Uniksa (zakładając, że jesteś na systemie Unix) i próba identyfikacji pliku. Jeśli twój system ma zainstalowany ImageMagick, polecenie identify powie ci wszystko o obrazach. Ale właśnie dzwoni file na to powie ci to zbyt:

~/Pictures$ file P1020359.jpg 
P1020359.jpg: JPEG image data, EXIF standard, comment: "AppleMark" 

Trzeba wezwać identify i file komendy w shell from Ruby:

%x(identify #{tempfile}) 
%x(file #{tempfile}) 
+0

Nawiasem mówiąc, coraz kodowanie bezpośrednio ze zmiennej wonów Działa, jeśli dane w formacie JPEG są zakodowane w formacie łańcuchowym, takim jak Base64. –

+0

Niesamowite wytłumaczenie. Na razie używam po prostu '.encoding.name! = 'ASCII-8BIT'', który będzie działał dobrze, dopóki nie zdecyduję się na bardziej rozbudowany później. Dziękuję za tak kompletną odpowiedź. –

+0

Chętnie pomogę! –

Powiązane problemy