1

我正在使用一个 tcl 脚本,它获取电影文件跟踪并将其转换为二进制文件,由 ns-2 中的应用程序代理进一步使用。这是将电影文件跟踪转换为二进制文件的脚本的代码片段:

set original_file_name Verbose_Silence_of_the_Lambs_VBR_H263.dat
set trace_file_name video.dat
set original_file_id [open $original_file_name r]
set trace_file_id [open $trace_file_name w]
set last_time 0
while {[eof $original_file_id] == 0} {
    gets $original_file_id current_line
    if {[string length $current_line] == 0 ||
    [string compare [string index $current_line 0] "#"] == 0} {
       continue  
    }

    scan $current_line "%d%s%d" next_time type length
    set time [expr 1000*($next_time-$last_time)]
    set last_time $next_time
    puts -nonewline $trace_file_id [binary format "II" $time $length]
}
close $original_file_id
close $trace_file_id 

但是当我进一步使用这个创建的 video.dat 文件来生成应用程序代理使用的流量时,我得到了以下错误:

Bad file siz in video.dat
Segmenatation fault

请对此有所收获。代码中二进制格式“II”的含义是什么。因为我没有在 tcl-binary(n) 文档中找到它,或者它已经过时并且现在不受支持。

4

1 回答 1

1

问题可能是您没有以二进制模式打开文件。

改变

set trace_file_id [open $trace_file_name w]

set trace_file_id [open $trace_file_name wb]

否则 Tcl 将改变输出,例如\n\r\non windows 替换。(对于大于 127 的字节值,它将被视为 unicode 代码点,然后转换为您的系统编码,从而弄乱您的整个二进制文件)虽然这样的事情对于文本文件来说很好,但它会产生二进制文件的问题。

幸运的是,只需要一个字符来解决这个问题:b作为修饰符open

编辑:我刚刚在Tcl的更改列表中b查找,打开的修饰符是在 8.5 中添加的。我一般只用8.5或者8.6,所以如果你用的是老版本的Tcl,在open之后加上下面一行:

fconfigure $trace_file_id -translation binary

b修饰符只是一个捷径。

于 2013-04-09T18:38:24.957 回答