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
#<MRKHeader version=1, uid_Validity=1106138982, uid_next=5825, 
last_write_counter=9872, unused="">
#<MRKMessage 
filename="\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\nmd5", 
flags=48, uid=808464432, msg_size=942814256, date=1936535094>
#<MRKMessage 
filename="g\000\000\000\000\000\00006\020\000\000\374P\000\000k\353\246Cmd5", 
flags=48, uid=808464432, msg_size=858993712, date=1936535091>
#<MRKMessage filename="g\000\000\000\000\000\000 
e\020\000\000\334\226\003\000X\373\253Cmd5", flags=48, uid=808464432, 
msg_size=858993712, date=1936535092>

-- 
Posted via http://www.ruby-forum.com/.