[Gambas-user] File Format Help

John Dovey dovey.john at gmail.com
Thu Jun 17 19:51:08 CEST 2021


Replying to myself again.
I've now progressed this far. Am I on the right track?

Sub Main()
    '' FidoMsg

    Dim FM_fromUserName As String '36
    Dim FM_toUserName As String '36
    Dim FM_subject As String '72
    Dim FM_DateTime As String ' 20
    Dim FM_timesRead As Short
    Dim FM_destNode As Short
    Dim FM_origNode As Short
    Dim FM_cost As Short
    Dim FM_origNet As Short
    Dim FM_destNet As Short
    Dim FM_destZone As Short
    Dim FM_origZone As Short
    Dim FM_destPoint As Short
    Dim FM_origPoint As Short
    Dim FM_replyTo As Short
    Dim FM_Attribute As Short
    Dim FM_nextReply As Short
    Dim FM_text As String 'null terminated
    ' 1) Numeric elements (bytes, byte-arrays, shorts, integers, longs) can
be Read directly From the stream.ie(4 byte Integer) = Read #Stream As
Integer. Gambas can handle little endian / big endian issues.
    ' 2)Fixed length strings must be handled In a two stage process.
    ' First, the required string length number Of bytes Is Read Into a byte
array. This byte array Is Then converted To a string.
    'Sample code:

    Dim hfile As File

    hfile = Open "test.msg" For Read 'Write Create
    ''Test
    Dim Bytes As New Byte[36]
    Bytes.Read(hfile)
    FM_fromUserName = Bytes.ToString()
    Bytes.Read(hfile)
    FM_toUserName = bytes.ToString()
    Dim Bytes2 As New Byte[72]
    Bytes2.Read(hfile)
    FM_subject = Bytes2.ToString()
    Dim Bytes3 As New Byte[20]
    Bytes3.Read(hfile)
    FM_DateTime = Bytes3.ToString()
    FM_timesRead = Read #hfile As Short
    FM_destNode = Read #hfile As Short
    FM_origNode = Read #hfile As Short
    FM_cost = Read #hfile As Short
    FM_origNet = Read #hfile As Short
    FM_destNet = Read #hfile As Short
    FM_destZone = Read #hfile As Short
    FM_origZone = Read #hfile As Short
    FM_destPoint = Read #hfile As Short
    FM_origPoint = Read #hfile As Short
    FM_replyTo = Read #hfile As Short
    FM_Attribute = Read #hfile As Short
    FM_nextReply = Read #hfile As Short
    FM_text = Read #hfile As String
    '' End Test
    'FidoMsg = Read #hfile As MyFidoMsg
    'Write #hfile, FidoMsg As MyFidoMsg
    Close #hfile
End Sub

On Thu, 17 Jun 2021 at 11:09, John Dovey <dovey.john at gmail.com> wrote:

> As a followup to my own message, this is what I've gotten to so far. I
> KNOW my struct is incorrect, but I'm not sure what it should be. For those
> interested, I've included a test.msg file that is maybe a better example.
>
> Public Struct myFidoMsg 'Datatype
>     fromUserName As Byte[] '36
>     toUserName As Byte[] '36
>     subject As Byte[] '72
>     DateTime As Byte[] ' 20
>     timesRead As Integer
>     destNode As Integer
>     origNode As Integer
>     cost As Integer
>     origNet As Integer
>     destNet As Integer
>     destZone As Integer
>     origZone As Integer
>     destPoint As Integer
>     origPoint As Integer
>     replyTo As Integer
>     Attribute As Integer
>     nextReply As Integer
>     text As String 'null terminated
> End Struct
>
> Sub Main()
>
>     Dim hfile As File
>     Dim FidoMsg As MyFidoMsg
>
>     hfile = Open "test.msg" For Read 'Write Create
>     FidoMsg = Read #hfile As MyFidoMsg
>     'Read
>     'Write #hfile, FidoMsg As MyFidoMsg
>     Close #hfile
> end sub
>
> On Thu, 17 Jun 2021 at 09:46, John Dovey <dovey.john at gmail.com> wrote:
>
>> I hope no-one minds if I ask this here. I'm just really unsure how to do
>> this best in Gambas.
>> I want to read and write files that have a (very old) specification
>> <http://ftsc.org/docs/fts-0001.016>
>> Essentially, it looks like this:
>>
>>  1. Application Layer Data Definition : a Stored Message
>>
>>                                Stored Message
>>
>>        Offset
>>       dec hex
>>               .-----------------------------------------------.
>>         0   0 |                                               |
>>               ~                 fromUserName                  ~
>>               |                   36 bytes                    |
>>               +-----------------------+-----------------------+
>>        36  24 |                                               |
>>               ~                  toUserName                   ~
>>               |                   36 bytes                    |
>>               +-----------------------+-----------------------+
>>        72  48 |                                               |
>>               ~                    subject                    ~
>>               |                   72  bytes                   |
>>               +-----------------------+-----------------------+
>>       144  90 |                                               |
>>               ~                    DateTime                   ~
>>               |                    20 bytes                   |
>>               +-----------------------+-----------------------+
>>       164  A4 | timesRead (low order) | timesRead (high order)|
>>               +-----------------------+-----------------------+
>>       166  A6 | destNode (low order)  | destNode (high order) |
>>               +-----------------------+-----------------------+
>>       168  A8 | origNode (low order)  | origNode (high order) |
>>               +-----------------------+-----------------------+
>>       170  AA |   cost (low order)    |   cost (high order)   |
>>               +-----------------------+-----------------------+
>>       172  AC | origNet (low order)   | origNet (high order)  |
>>               +-----------------------+-----------------------+
>>       174  AE | destNet (low order)   | destNet (high order)  |
>>               +-----------------------+-----------------------+
>>       176  B0 | destZone (optional)   | destZone (optional)   |
>>               +-----------------------+-----------------------+
>>       178  B2 | origZone (optional)   | origZone (optional)   |
>>               +-----------------------+-----------------------+
>>       180  B4 | destPoint(optional)   | destPoint(optional)   |
>>               +-----------------------+-----------------------+
>>       182  B6 | origPoint(optional)   | origPoint(optional)   |
>>               +-----------------------+-----------------------+
>>       184  B8 |  replyTo (low order)  |  replyTo (high order) |
>>               +-----------------------+-----------------------+
>>       186  BA | Attribute (low order) | Attribute (high order)|
>>               +-----------------------+-----------------------+
>>       188  BC | nextReply (low order) | nextReply (high order)|
>>               +-----------------------+-----------------------+
>>       190  BE |                      text                     |
>>               ~                    unbounded                  ~
>>               |                 null terminated               |
>>               `-----------------------------------------------'
>>
>>       Message    = fromUserName(36)  (* Null terminated *)
>>                    toUserName(36)    (* Null terminated *)
>>                    subject(72)       (* see FileList below *)
>>                    DateTime          (* message body was last edited *)
>>                    timesRead         (* number of times msg has been read *)
>>                    destNode          (* of message *)
>>                    origNode          (* of message *)
>>                    cost              (* in lowest unit of originator's
>>                                         currency *)
>>                    origNet           (* of message *)
>>                    destNet           (* of message *)
>>                    destZone          (* of message *)
>>                    origZone          (* of message *)
>>                    destPoint         (* of message *)
>>                    origPoint         (* of message *)
>>                    replyTo           (* msg to which this replies *)
>>                    AttributeWord
>>                    nextReply         (* msg which replies to this *)
>>                    text(unbounded)   (* Null terminated *)
>>
>> There is a sample packet <https://www.dan.info/sampledata/BAD_BNDL.007> you can look at if you really want to see what it looks like, but this should give you an idea:
>>
>> [image: image.png]
>>
>>
>> I'm guessing a "Struct" of some sort?
>>
>> Any advice would be appreciated.
>>
>>
>> John
>>
>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gambas-basic.org/pipermail/user/attachments/20210617/f8a4b5a0/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 41649 bytes
Desc: not available
URL: <http://lists.gambas-basic.org/pipermail/user/attachments/20210617/f8a4b5a0/attachment-0001.png>


More information about the User mailing list