[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