How to read 8-byte integers in GMS 2.x?

175 views Asked by At

I need to read 8-byte integers from a stream. I could not find any documentation how to read 8-byte integers in DM. It would be something similar to a long long integer. Is there a trick how to stream 8-byte integers from file in GMS 2.x ?

3

There are 3 answers

0
KEVIVI On

We can use the "Stream" object to read/import data of various kinds. Please refer to the DM Help > Scripting > File Input and Output:

DM Help

Other examples can also be found at DM-Script-Database :

Hope this helps.

0
BmyGuest On

There is nothing like an 8-byte integer in DigitalMicrograph. You can use the streaming to read in two successive 4-byte sections as integers (See answer above) and then display them as binary using binary() or hexadecimal using hex(), but you will have to do the maths yourself for the "meaning" of the 8-byte integer (storing it as real-number). You can use the binary operators & | ^ for bitwise numeric, when needed.

2
w4m On

I used the following (stupid) method to do so:

number  readint32(object s){
    number stream_byte_order=2
    number result=0
    TagGroup tg = NewTagGroup(); 
    tg.TagGroupSetTagAsLong( "SInt32_0", 0 )  
    TagGroupReadTagDataFromStream( tg, "SInt32_0", s, stream_byte_order );  
    tg.TagGroupGetTagAsLong( "SInt32_0", result)  
    return result
}

number  readint64(object s){
    //new for reading 8-byte integer in TIA ver >3.7
    //DM automatic convert result to float when the second 4-byte >1
    number result = readint32(s)+ (readint32(s)*4294967296)
    // 4294967296 equals to 0xFFFFFFFF in hex form
    return result
} 

It works with reading ser <2GB, but does not for larger file. I still did not figure it out...

@09-04-2016

Now i got a solution to the data offset problem in ser: Here is the solution:

Void  b_readint64(object s, number &lo, number &hi){
    //new for reading 8-byte (64bit) integer in TIA ver >3.7
    //read the low and high section individually and later work 
    //together with StreamSetPos32singed, StreamSetPos64 funcsions
    lo = b_readint32(s)
    hi = b_readint32(s)
}

Void StreamSetPos32Signed(object s, number base, number lo){
if (lo>0) StreamSetPos(s, base, lo)
else      StreamSetPos(s, base, 4294967296+lo)
}

Void StreamSetPos64(object s, number base, number lo, number hi){
    if (hi!=0){
        StreamSetPos(s, base, 0)
        for (number i=0; i<hi; i++) StreamSetPos(s, 1, 4294967296)
        StreamSetPos32Signed(s, 1, lo)
    } else  StreamSetPos32signed(s, base, lo)
}

BTW, I just uploaded this upgraded script to http://portal.tugraz.at/portal/page/portal/felmi/DM-Script/DM-Script-Database