- 积分
- 9841
- 回帖
- 0
- 西莫币
-
- 贡献
-
- 威望
-
- 存款
-
- 阅读权限
- 120
- 最后登录
- 1970-1-1
该用户从未签到
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
开始看到ubit1,ubit2,想到肯定就是位,但是为什么会有1和2的区分呢?弄好半天才明白过来。
新建一个记事本文件在E盘test.txt,文件内写入一个字母a,保存。
然后用matlab读文件,程序如下:
fid=fopen('E:\test.txt','r');
c=fread(fid,8,'ubit1') %一次性都1位,读8位才能将a读出来。如果只读一位c=fread(fid,1,'ubit1') ,结果就是1.
运行程序,得到结果是
c =
1
0
0
0
0
1
1
0
初看这个结果很不对1000 0110,因为字符a的ASCII是97,97的二进制码是0110 0001.
我笨就笨在这里,原来要倒着看才行,倒过来不就刚好就是97的二进制码。读的时候直接转化为二进制码,显示的时候从最小位开始显示。所以看的时候要从下往上看。
再来看看ubit2是怎么回事?
fid=fopen('E:\test.txt','r');
c=fread(fid,4,'ubit2') %一次性读2位,读2次就将a读出来了。
程序运行结果是:
c =
1
0
2
1
只有四位,这个时候马上就有经验了,从下往上看,1201,再联想到ubit后面的2,马上想到每一位可能代表两个二进制码。
先表示出来就是:01 10 00 01,写在一起就是0110 0001,刚好也是97的二进制码。
总结:到这里就完全明白了。原来是ubit后面的数字表示是一次读几位,中间的数据表示读几次。读出来的数据用十进制来显示。那么如果一次读8位呢?就是ubit8,结果是不是应该就直接是97呢?
fid=fopen('E:\test.txt','r');
c=fread(fid,1,'ubit8') %一次性读8位,那么a只要一次就读出来了,如果c=fread(fid,2,'ubit8') 表示一次读8位,读2次,但是文件又没有
%那么多的数据,后面的为空,不显示。
程序运行如下:
c =
97
果然是这样的。
如果一次读的位数超出了,比如读ubit10,那么结果还是97,test文件后中存储ab两个字符,就将两个字符转换成二进制,然后按照一次读十位来读。
fid=fopen('E:\test.txt','r');
c=fread(fid,1,'ubit10')
程序结果如下:
c =
609
分析一下:a的二进制是0110 0001,b的二进制0110 0010.
排列应该是这样排列的先读a,0110 0001,不够10位,再读b的两位,从低位开始,读10
总的排列应该是10 0110 0001,转化为十进制就是609了,记住从低开始读取就行了。
如果是读两次呢?
fid=fopen('E:\test.txt','r');
c=fread(fid,2,'ubit10')
程序结果如下:
c =
609
24
分析如下,前面读了10位,后面只有6位,就是0110 00,转化为十进制就是24.
好了,到这里就全部明白了。 |
|