如何读取GMS 2.x中的8字节整数?

时间:2015-06-12 21:33:36

标签: dm-script

我需要从流中读取8字节整数。我找不到任何文档如何读取DM中的8字节整数。它类似于长整数。 有没有一个技巧如何从GMS 2.x中的文件传输8字节整数?

3 个答案:

答案 0 :(得分:1)

我们可以使用" Stream"对象读取/导入各种数据。请参阅DM帮助>脚本>文件输入和输出:

DM Help

其他示例也可以在DM-Script-Database找到:

希望这有帮助。

答案 1 :(得分:1)

我使用以下(愚蠢)方法来执行此操作:

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
} 

它适用于读取ser< 2GB,但不适用于较大的文件。我还是没弄清楚......

@ 09-04-2016

现在我得到了一个解决ser中数据偏移问题的方法: 这是解决方案:

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,我刚刚将这个升级过的脚本上传到 http://portal.tugraz.at/portal/page/portal/felmi/DM-Script/DM-Script-Database

答案 2 :(得分:0)

DigitalMicrograph中没有类似8字节的整数。您可以使用流式传输以两个连续的4字节部分作为整数读取(请参阅上面的答案),然后使用binary()或十六进制使用hex()将它们显示为二进制,但您必须进行数学运算你自己为8字节整数的“含义”(将其存储为实数)。你可以使用二元运算符&amp; | ^在需要时为按位数字。