From: Fabio Vitale Date: 2006-07-18T15:39:14+09:00 Subject: Re: How can I parse binary files? Fabio Vitale wrote: This is the structure of class MRKMessage: Message data (36 bytes per message): - Filename (23 bytes including terminating NUL character) - Flags (1 byte bitmask) - UID (4 byte unsigned integer) - Message size (4 byte unsigned integer) - Date (4 byte time_t value) Flags mask is 1:Recent, 2:Draft, 4:Deleted, 8:Flagged, 16:Answered, 32:Seen. Now 3 major questions: Q 1: what type must I declare for Filename in the class MRKMessage? Q 2: what type must I declare for Flags in the class MRKMessage? Q 3: what type must I declare for Date in the class MRKMessage? ...and 2 minor ones :-)) Q 4: How to decode Flags? Q 5: How to decode Date? BIG BIG THANKS TO ALL! ------------ require 'bit-struct' class MRKHeader < BitStruct unsigned :version, 32, "Version", :endian => :native unsigned :uid_Validity, 32, "UIDValidity", :endian => :native unsigned :uid_next, 32, "UIDNext", :endian => :native unsigned :last_write_counter, 32, "LastWriteCounter", :endian => :native rest :unused, "Unused" def MRKHeader.bit_length super 36*8 end end class MRKMessage < BitStruct char :filename, 184, "FileName", :endian => :native unsigned :flags, 8, "Flags", :endian => :native unsigned :uid, 32, "UID", :endian => :native unsigned :msg_size, 32, "MsgSize", :endian => :native unsigned :date, 32, "Date", :endian => :native def MRKMessage.bit_length super 36*8 end end File.open("imap.mrk", "rb") {|f| head_string = f.read(MRKHeader.round_byte_length) raise "No header!" unless head_string mrk_header = MRKHeader.new(head_string) puts mrk_header.inspect while msg_string = f.read(MRKMessage.round_byte_length) do puts MRKMessage.new(msg_string).inspect end } This now generates: >ruby b.rb # # # # -- Posted via http://www.ruby-forum.com/.