[Gambas-user] reading files

Tony Morehen tmorehen at ...3602...
Wed Jul 19 14:34:04 CEST 2017


I've attached an archive containing the code I use to read v1 and v2 MP3 
tags and other MP3 info including bitrates (fixed and VBR), sampling 
rates and number of channels.  v1 tags are pretty staightforward to read 
if you don't try to read the structure directly, but by each element of 
the structure at a time.  Some tips:

1) Numeric elements (bytes, bytearrays, 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 Bytes As New Byte[StringLength]
   Bytes.Read(Stream)
   FixedString = Bytes.ToString()

Note: Bytes.ToString stops the string conversion at the first null or at 
the end of the array.  Therfore, you don't have to worry about 
null-terminated strings.

v2 tags are more complicated, particularly since the tags can be ascii, 
either kind of utf16, or utf8 encoding.  The code I sent has been tested 
with over 10,000 mp3 files has seems to have no issues.


On 2017-07-19 12:33 AM, Shane wrote:
> thank you Gian i did take a rest and read but alas it did not help
>
> as far as i see it he is saying don't use binary file for fixed length 
> strings
>
> but as this is an mp3 file tag witch i have no control i am doomed
>
>
>
> On 18/07/17 19:22, Gianluigi wrote:
>> Why do not you take a moment of rest and read what Tobias Boege 
>> recommend
>> me in the discussion [0] I told you here [1]?
>>
>> [0]
>> http://gambas.8142.n7.nabble.com/Random-access-files-with-fixed-length-string-td50880.html 
>>
>> [1] http://gambas.8142.n7.nabble.com/vb-code-td59764.html
>>
>> 2017-07-18 9:04 GMT+02:00 Shane <buster6seven at ...626...>:
>>
>>> I am very confused from the docs
>>>
>>> _Variable_ *= READ* [ *#* _Stream_ ] *AS* _Datatype_
>>>
>>> _Variable_ *= READ* [ *#* _Stream_ *,* ] _Length_
>>>
>>> so wouldn't it be_
>>> _
>>>
>>> IDtag = read #hfile  as ID3v1_TAG  ?
>>>
>>> with doesn't work by the way
>>>
>>>
>>>
>>> On 18/07/17 12:44, nando_f at ...951... wrote:
>>>
>>>> I think
>>>>           Read #hfile, IDtag, ID3v1_TAG
>>>> should be
>>>>           Read #hfile, IDtag as ID3v1_TAG
>>>>
>>>>
>>>> -- 
>>>> Open WebMail Project (http://openwebmail.org)
>>>>
>>>>
>>>> ---------- Original Message -----------
>>>> From: Shane <buster6seven at ...626...>
>>>> To: gambas-user at lists.sourceforge.net
>>>> Sent: Tue, 18 Jul 2017 10:50:43 +1000
>>>> Subject: Re: [Gambas-user] reading files
>>>>
>>>> i don't know what i am doing wrong
>>>>> Public Struct ID3v1_TAG '(128 bytes)
>>>>>         Tag[3] As String               'always TAG
>>>>>         Title[30] As String             'title, 30 characters
>>>>>         Artist[30] As String           'artist, 30 characters
>>>>>         Album[30] As String           'album, 30 characters
>>>>>         Year[4] As String              'year, 4 characters
>>>>>         Comment[30] As String          'comment, 30 characters (or 
>>>>> 28 if
>>>>> track# included)
>>>>>         Genre As Byte                   'genre, 255 for none defined
>>>>> End Struct
>>>>>
>>>>> Private Sub GetID3v1(File As String)
>>>>>        Dim IDtag As ID3v1_TAG
>>>>>        Dim hfile As File
>>>>>
>>>>>        hfile = Open File For Read
>>>>>
>>>>>            '
>>>>>            'read the tag
>>>>>            ' seek to end of less tag size
>>>>>
>>>>>            Read #hfile, IDtag, ID3v1_TAG
>>>>>
>>>>> here i get IDtag is NULL
>>>>>
>>>>> On 18/07/17 05:05, nando_f at ...951... wrote:
>>>>>
>>>>>> Yes it is possible, I do it.  here is some code (incomplete)
>>>>>>
>>>>>> -Nando (Canada)
>>>>>>
>>>>>>
>>>>>>
>>>>>> ' top of class file
>>>>>> Public Struct recstruc
>>>>>>      _a as integer
>>>>>>      _b as integer
>>>>>>      _c as integer
>>>>>> end struct
>>>>>>
>>>>>>
>>>>>> ' a function
>>>>>> public function openAfile(filename as string) as file
>>>>>>
>>>>>> dim hfile as file
>>>>>> dim arec as recstruc
>>>>>>
>>>>>> hfile = open filename for read write create
>>>>>>
>>>>>> with arec   'some values to write.
>>>>>>      ._a = 1
>>>>>>      ._b = 22
>>>>>>      ._c = 333
>>>>>> end with
>>>>>>
>>>>>> write #hfile, arec as recstruc
>>>>>>
>>>>>> 'if you position the hfile pointer back to zero, you can...
>>>>>> read #hfile, arec as recstruc
>>>>>>
>>>>>> close #hfile
>>>>>>
>>>>>> end
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> -- 
>>>>>> Open WebMail Project (http://openwebmail.org)
>>>>>>
>>>>>>
>>>>>> ---------- Original Message -----------
>>>>>> From: T Lee Davidson <t.lee.davidson at ...626...>
>>>>>> To: gambas-user at lists.sourceforge.net
>>>>>> Sent: Sun, 16 Jul 2017 12:42:35 -0400
>>>>>> Subject: Re: [Gambas-user] reading files
>>>>>>
>>>>>> On 07/16/2017 06:57 AM, Shane wrote:
>>>>>>>> given this example
>>>>>>>>
>>>>>>>> PRIVATE SUB BinaryRead(FilePath AS String)
>>>>>>>>       DIM binaryFile AS File
>>>>>>>>       DIM i AS Integer
>>>>>>>>       DIM b AS Byte
>>>>>>>>       DIM s AS Short
>>>>>>>>       DIM s1 AS String
>>>>>>>>       DIM s2 AS String
>>>>>>>>       ' Read binary file
>>>>>>>>       binaryFile = OPEN FilePath FOR READ
>>>>>>>>       READ #binaryFile, i
>>>>>>>>       READ #binaryFile, b
>>>>>>>>       READ #binaryFile, s
>>>>>>>>       READ #binaryFile, s1
>>>>>>>>       READ #binaryFile, s2
>>>>>>>>       CLOSE #binaryFile
>>>>>>>>       ' Display results
>>>>>>>>       PRINT i
>>>>>>>>       PRINT b
>>>>>>>>       PRINT s
>>>>>>>>       PRINT s1
>>>>>>>>       PRINT s2
>>>>>>>> END
>>>>>>>>
>>>>>>>>
>>>>>>>> is there a way for gambas to read a struct of all these variables
>>>>>>>> in one read ?
>>>>>>>>
>>>>>>>> You may have hinted at the solution within your question. Have you
>>>>>>> considered
>>>>>>> using a Structure?
>>>>>>>
>>>>>>> http://gambaswiki.org/wiki/lang/read :
>>>>>>> "... reads the stream Stream as binary data whose type is 
>>>>>>> specified by
>>>>>>> the
>>>>>>> Datatype argument."
>>>>>>>
>>>>>>> "The returned datatype can be one of the following: NULL, Boolean,
>>>>>>> Byte, Short,
>>>>>>>     Integer, Long, Pointer, Single, Float, Date, String, 
>>>>>>> Variant, any
>>>>>>> Array,
>>>>>>>     Collection or structure."
>>>>>>>
>>>>>>> http://gambaswiki.org/wiki/lang/structdecl
>>>>>>>
>>>>>>> -- 
>>>>>>> Lee
>>>>>>>
>>>>>>> ------------------------------------------------------------
>>>>>>> ------------------
>>>>>>> Check out the vibrant tech community on one of the world's most
>>>>>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>>>>> _______________________________________________
>>>>>>> Gambas-user mailing list
>>>>>>> Gambas-user at lists.sourceforge.net
>>>>>>> https://lists.sourceforge.net/lists/listinfo/gambas-user
>>>>>>>
>>>>>> ------- End of Original Message -------
>>>>>>
>>>>>>
>>>>>> ------------------------------------------------------------
>>>>>> ------------------
>>>>>> Check out the vibrant tech community on one of the world's most
>>>>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>>>> _______________________________________________
>>>>>> Gambas-user mailing list
>>>>>> Gambas-user at lists.sourceforge.net
>>>>>> https://lists.sourceforge.net/lists/listinfo/gambas-user
>>>>>>
>>>>> ------------------------------------------------------------
>>>>> ------------------
>>>>> Check out the vibrant tech community on one of the world's most
>>>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>>> _______________________________________________
>>>>> Gambas-user mailing list
>>>>> Gambas-user at lists.sourceforge.net
>>>>> https://lists.sourceforge.net/lists/listinfo/gambas-user
>>>>>
>>>> ------- End of Original Message -------
>>>>
>>>>
>>>> ------------------------------------------------------------
>>>> ------------------
>>>> Check out the vibrant tech community on one of the world's most
>>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>> _______________________________________________
>>>> Gambas-user mailing list
>>>> Gambas-user at lists.sourceforge.net
>>>> https://lists.sourceforge.net/lists/listinfo/gambas-user
>>>>
>>> ------------------------------------------------------------
>>> ------------------
>>> Check out the vibrant tech community on one of the world's most
>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>> _______________________________________________
>>> Gambas-user mailing list
>>> Gambas-user at lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/gambas-user
>>>
>> ------------------------------------------------------------------------------ 
>>
>> Check out the vibrant tech community on one of the world's most
>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>> _______________________________________________
>> Gambas-user mailing list
>> Gambas-user at lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/gambas-user
>
>
> ------------------------------------------------------------------------------ 
>
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Gambas-user mailing list
> Gambas-user at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gambas-user

-------------- next part --------------
A non-text attachment was scrubbed...
Name: Mp3Tag.tar.gz
Type: application/gzip
Size: 20831 bytes
Desc: not available
URL: <http://lists.gambas-basic.org/pipermail/user/attachments/20170719/faca5130/attachment.gz>


More information about the User mailing list