2010-10-07 18 views
3

Je veux diviser data de morceaux de disons 8154 octets:Ruby: données binaires de Split

data = Zlib::Deflate.deflate(some_very_long_string) 

Quelle serait la meilleure façon de le faire?

J'ai essayé d'utiliser:

chunks = data.scan /.{1,8154}/ 

... mais les données ont été perdu! data avait un size de 11682, mais lors de la boucle à travers chaque morceau et résumant le size je me suis retrouvé avec une taille totale de 11677. 5 octets ont été perdus! Pourquoi? Les expressions rationnelles ne sont pas un bon moyen d'analyser les données binaires.

Répondre

5

Utilisez bytes et each_slice pour exploiter des octets. Et utiliser pack 'C*' pour les convertir en chaînes pour la sortie ou debug:

irb> data = File.open("sample.gif", "rb", &:read) 
=> "GIF89a\r\x00\r........." 

irb> data.bytes.each_slice(10){ |slice| p slice, slice.pack("C*") } 
[71, 73, 70, 56, 57, 97, 13, 0, 13, 0] 
"GIF89a\r\x00\r\x00" 
[247, 0, 0, 0, 0, 0, 0, 0, 51, 0] 
"\xF7\x00\x00\x00\x00\x00\x00\x003\x00" 
........... 
+0

Cela a bien fonctionné! Je vous remercie! :) –

+1

Est-ce que ça ne va pas être très lent? –

0

La réponse acceptée fonctionne, mais crée des tableaux et non nécessaires est extrêmement lent pour les gros fichiers.

Cette alternative fonctionne très bien et est beaucoup plus rapide (500x pour un fichier de 1 Mo et morceaux 10kb!):

def get_binary_chunks(string, size) 
    Array.new(((string.length + size - 1)/size)) { |i| string.byteslice(i * size, size) } 
end 

Pour l'exemple donné, vous utiliseriez cette façon:

chunks = get_binary_chunks(data, 8154)