湘攸客

二进制文件处理

0
阅读(39303)

工程中有个数据文件,存储的是“事件”的处理结果,每个“事件”的处理结果是32bit,即4个字节。几百万甚至上亿个事件的处理结果都存储在一个二进制文件里(c语言创建或者访问此文件应该不难),这里给出在tcl里如何访问此文件。

set chan [open "lg5mm.dat" r] 
     set myfile2 [open "bin_lg5mm.txt" w+]
     fconfigure $chan -translation binary
     while {1} {
            set data_read [read $chan 4]/*;##一次读4个字节,即32bit,在循环体中,该命令似乎可以自动连续往后读。*/
            .top.t insert end "The string is <$data_read>\t"
            binary scan $data_read "H*" tmp0//;##将这4个字节转换成16进制数据
            .top.t insert end "The binary is <$tmp0>\n"
            

            puts $myfile2 $tmp0

            if {[eof $chan]} {/*;###判断是否到文件末尾,由于lg5mm.dat文件太大,写入文本文件时间长,有时会导致内存不足。*/
                break
            }

     }

程序中有2个文件,lg5mm.dat和bin_lg5mm.txt。前一个.dat是原始二进制数据文件,用Uedit打开如下:

后一个.txt是用tcl每读取.dat文件一个“事件”结果(即32bit)存入到.txt文件中一行,即每个事件结果存入文本文件的一行:

注意体会这句代码

fconfigure $chan -translation binary

如果不加这一句,后面读取二进制文件会出现意想不到的错误,即read命令会莫名其妙的提前结束。