2013-02-16 5 views
5

다음 문자열의 바이트 길이를 지정하고 다음 항목의 바이트 크기를 지정하는 정수를 갖도록 구성된 3 개의 문자열로 구성된 3 개의 문자열이 있습니다. 마치 누군가가 한 것처럼 :Ruby String # unpack

[a.bytesize, a, b.bytesize, b, c.bytesize, c].pack("na*na*na*") 

어떻게하면 간단하게 풀 수 있습니까? 이 문제에 펄 솔루션이었다 쉬운을

vals = [] 
3.times do 
    size = data.unpack("n").first 
    data.slice!(0, 2) 
    vals << data.unpack("a#{size}").first 
    data.slice!(0, size) 
end 

있나요 : 분명히 압축 풀기에 '/'와 괄호를 지원하지 않습니다 루비, 들어

my($a, $b, $c) = unpack("(n/a*)3", $data) 

, 내가 좋아하는 뭔가를 사용하고 있습니다 이게 뭐야?

+1

, 나는 루비의 이슈 트래커에 압축 풀기를 확장하는 기능 요청을 고려 구현이 일부 펄 기능을 얻는 경우에 유용 할 수있다처럼 보인다 것이다 – Speed

답변

0

Perl 솔루션만큼이나 쉽게이를 수행 할 수있는 방법이 없습니다 (루비의 팩/언팩 구현에 추가 된 기능 요청을 제출하는 것이 좋음). 그러나 적어도 제공 할 수 있습니다. 적은 라인의 솔루션은 그 도움이된다면 : 단조 않은 실행 루프를 압축을 풉니 대신, http://bindata.rubyforge.org/ 나는 당신이 그것을 사용한다고 생각 :

vals = [] 
until data.empty? 
    vals << data.slice!(0, data.slice!(0,2).unpack('n').first.to_i).unpack("a*").first 
end 
0

당신이 어떤 심각한 이진 데이터 처리를해야하는 경우에 대한 보석이있다.

물론 기능 요청을 제출하고 구현할 때까지 기다릴 수 있습니다. 하지만 훨씬 강력한 솔루션 인 IMO 인 대신 bindata gem을 사용하는 것이 좋습니다.

1

IMHO PERL처럼 쉽지는 않지만 이것은 제가 제안 할 수있는 몇 가지 해결책입니다. 누군가가이에 대한 간단한 해결책을 발견하지 않는 한

unpacked = [] 
a, b, c = *unpacked << data.slice!(0, data.slice!(0, 2).unpack('S>').first) \ 
      until data.empty?