我需要从流中读取 8 字节整数。我找不到任何文档如何在 DM 中读取 8 字节整数。这将类似于 long long 整数。是否有技巧如何从 GMS 2.x 中的文件流式传输 8 字节整数?
问问题
156 次
3 回答
1
我们可以使用“Stream”对象来读取/导入各种数据。请参考 DM 帮助 > 脚本 > 文件输入和输出:
其他示例也可以在DM-Script-Database中找到:
- Read-Ser ( http://donation.tugraz.at/dm/source_codes/127 )
- JEMS_.ems 文件阅读器(http://donation.tugraz.at/dm/source_codes/108)
希望这可以帮助。
于 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 回答