我正在使用一个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)文档中找到它,或者它已过时且现在不受支持。
答案 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
修饰符只是它的快捷方式。