我需要从流中读取8字节整数。我找不到任何文档如何读取DM中的8字节整数。它类似于长整数。 有没有一个技巧如何从GMS 2.x中的文件传输8字节整数?
答案 0 :(得分:1)
我们可以使用" Stream"对象读取/导入各种数据。请参阅DM帮助>脚本>文件输入和输出:
其他示例也可以在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; | ^在需要时为按位数字。