lilybunny 发表于 2013-6-19 15:10

matlab中的ubit1,ubit2表示的意思

开始看到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 1000 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.

好了,到这里就全部明白了。

XIAN_ChZ57 发表于 2018-8-2 21:31

多谢楼主多谢楼主
页: [1]
查看完整版本: matlab中的ubit1,ubit2表示的意思