在《学习Tcl(续三)》中我给出了一个在String和Binary类型之间转换的程序。编写这一程序的目的是为了区分Tcl中使用这两种数据类型时的差异,并且通过编写程序的方式提供一个实际的应用方法。 riple
但是这个程序是错误的,程序中提到的String和Binary类型刚好相反。这一点是我在昨晚练习创建二进制文件时发现的。我按照错误的方法创建的文件是预期文件大小的两倍。想一想为什么。 riple
正确的程序如下: riple
set string_type [lindex $argv 0]
puts "string type : $string_type"
set numeric_type [binary format "H2" $string_type]
puts "numeric type : $numeric_type"
binary scan $numeric_type "H*" string_again
puts "string again : $string_again"
set numeric_again [binary format "H2" $string_again]
puts "numeric again : $numeric_again"
当时导致我颠倒这两个概念的原因是:我认为能够显式地输出为数值的数据类型就是二进制类型,我认为puts会如实地把数据的原本形式输出到用户界面。 riple
先说第一个错误认识:能够显式地输出为数值的数据类型其实是String,是显示为数值的String。 riple
再说第二个错误认识:puts,顾名思义,是put string的意思。puts输出的内容,采用文本方式查看,都是String类型的。而我从用户界面和记事本里看到的,恰好都只能是字符,而不是二进制。查看二进制文件需要在类似UltraEdit的软件中,使用HEX方式打开文件。 riple
综合上述认识,可以认为,通过用户界面和记事本看到的数据,如果和输入的原数据一模一样的话,那么原数据类型是String;反之,如果查看到的结果令人意外的话,那么原数据类型就多半是Binary的。 riple
这本是一个很基本的概念,只是我在这些方面的知识不够扎实,造成了错误的,甚至是黑白颠倒的认识和理解。基本的概念并不等于清楚易懂的概念,甚至可能是被我误解的概念,而我还浑然不觉呢。 riple
在此向可能被我误导的朋友道歉,并提醒被我误导的朋友,你在二进制数据类型上的认识可能也是不可靠的。 riple
文章评论(0条评论)
登录后参与讨论