ns-2中video.dat中的文件大小错误

时间:2013-02-27 17:56:42

标签: tcl binaryfiles ns2

我正在使用一个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)文档中找到它,或者它已过时且现在不受支持。

1 个答案:

答案 0 :(得分:1)

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

更改

set trace_file_id [open $trace_file_name w]

set trace_file_id [open $trace_file_name wb]

否则Tcl会改变输出,例如在Windows上用\n替换\r\n。 (对于字节值> 127,它将被视为unicode代码点,然后转换为您的系统编码,从而弄乱您的整个二进制内容) 虽然文本文件很好,但它会产生二进制文件的问题。

幸运的是,只需要一个字符来修复它:b作为open的修饰符

修改:我刚刚在change list中查找了Tcl,b修改为open,添加了8.5。我通常只使用8.5或8.6,所以如果您使用的是旧版本的Tcl,请在打开后添加以下行:

fconfigure $trace_file_id -translation binary

b修饰符只是它的快捷方式。