爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 3343|回复: 1

[求助] 字符型强制转换成long型的问题

[复制链接]

新浪微博达人勋

发表于 2013-10-22 20:07:42 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
我有一个由c++生成的bin文件,里面是一个由char, int, short int等组成的结构体,结构体的结构是已知的,现在要在IDL里头把这个文件读出来,READU无法使用,只能用READ_BINARY,默认转换成为byte型,前面几个结果为
214 208 185 250 0 0 0 0 0 0 0 0 0 0 0 0
10 42 2 0

其中按照结构体的结构(甲方给的一个文档)规定,第一行的16个byte表示c++里头的一个char,所以在IDL里我就这样子把它读出来:
print, string(byte([214, 208, 185, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]))
结果是: 中国
按照文档对结构体的规定,第二列对应的是c++里头的一个int,但在c++里头int占4个byte,那么对应IDL里头应该是long,所以这样来写
print, long(byte([10, 42, 2, 0]))
可是结果却是:
10 42 2 0
显然byte()没有把四个byte组合成一个类似32位的二进制数,所以才会一个byte一个byte的转换成long型,于是想到将这四个数先WRITEU转换成二进制的dat文件然后再读取这个文件:
outfile = 'test.dat'
openw, ounit, outfile, /get_lun
writeu, ounit, outfile, byte([10, 42, 2, 0])
free_lun, ounit
;--------------------
x = 0L
infile = outfile
openr, iunit, infile, /get_lun
readu, iunit, x
free_lun, iunit
这样子再检查x,发现对了
print, x
141834

虽然后面这样“曲线救国”能够正确得到一个long型数据,但是我这里这个bin文件有一万条int的数据,要是都这么做感觉没法弄了,所以想问下大家,是不是我这里print, long(byte([10, 42, 2, 0]))没有写对?还有就是,一般bin文件在IDL里头怎么读的呢?


谢谢!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-10-23 10:29:39 | 显示全部楼层
非常好的教程。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表