1

我需要从流中读取 8 字节整数。我找不到任何文档如何在 DM 中读取 8 字节整数。这将类似于 long long 整数。是否有技巧如何从 GMS 2.x 中的文件流式传输 8 字节整数?

4

3 回答 3

1

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

DM 帮助

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

希望这可以帮助。

于 2015-06-13T12:13:16.823 回答
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)
}

顺便说一句,我刚刚将此升级后的脚本上传到 http://portal.tugraz.at/portal/page/portal/felmi/DM-Script/DM-Script-Database

于 2015-10-07T10:27:05.080 回答
0

在 DigitalMicrograph 中没有什么能比得上 8 字节整数。您可以使用流以整数形式读取两个连续的 4 字节部分(参见上面的答案),然后使用 将它们显示为二进制binary()或使用 16 进制hex(),但您必须自己计算 8- 的“含义”字节整数(将其存储为实数)。您可以使用二元运算符 & | ^ 用于按位数字,在需要时。

于 2015-06-13T19:01:42.903 回答