2013-07-23 2 views
2

JPG 또는 MP4 파일의 이진 Blob 헤더가 있습니다. 나는이 둘을 구별하려고 노력하고있다.Ruby에서 바이트 비교

파일이 JPG 인 경우 처음 두 바이트는 \xFF\xD8입니다. 그러나 비교를 blob[0] == "\xFF"으로 만들면 실패합니다. 사실을 알고 있더라도 blob[0]은 사실입니다. \xFF

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+0

좋아, 그래서 루비는''' "\ xFF"''를 인쇄 할 때만 이진 인코딩으로 바꾼다. 내 솔루션은 강제 인코딩 방법을 사용하는 것이 었습니다 : ''' "\ xFF".force_encoding ("BINARY") == blob [0]''' – Brennan

+0

0xff와 0xd8은 비트가 아니며 바이트입니다. 그들 사이의 중요한 차이. 코드를 개발할 때 올바른 용어를 사용하는 것이 좋습니다. –

+0

예, 답변을 시도하고 기다려야한다고 말했습니다. @theTinMan, 와우 웁스. 나는 조금 (하) 개발했고 그것을 알고 있었다. 긴 하루였습니다 – Brennan

답변

5

인코딩 문제입니다. 당신은 UTF-8로 인코딩 된 문자열을 바이너리 인코딩 (당신의 JPEG의 BLOB) ("\xFF") 문자열을 비교하는 :

바이너리 인코딩 된 문자열 만드는 방법에는 여러 가지가 있습니다
foo = "\xFF".force_encoding("BINARY") # like your blob 
bar = "\xFF" 
p foo   # => "\xFF" 
p bar   # => "\xFF" 
p foo == bar # => false 

:

str = "\xFF\xD8".b       # => "\xFF\xD8" (Ruby 2.x) 
str.encoding        # => #<Encoding:ASCII-8BIT> 

str = "\xFF\xD8".force_encoding("BINARY") # => "\xFF\xD8" 
str.encoding        # => #<Encoding:ASCII-8BIT> 

str = 0xFF.chr + 0xD8.chr     # => "\xFF\xD8" 
str.encoding        # => #<Encoding:ASCII-8BIT> 

str = ["FFD8"].pack("H*")     # => "\xFF\xD8" 
str.encoding        # => #<Encoding:ASCII-8BIT> 

모든 위의 값은 blob과 비교할 수 있습니다.

+0

고마워, 내가 필요로하는 것. – Brennan

관련 문제