我正在使用一个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)文档中找到它,或者它已经过时了并且现在不受支持。
发布于 2013-04-10 02:38:25
问题可能是你没有在二进制模式下打开你的文件。
变化
set trace_file_id [open $trace_file_name w]至
set trace_file_id [open $trace_file_name wb]否则Tcl将更改输出,例如在windows上用\r\n替换\n。(对于大于127的字节值,它将被视为unicode代码点,然后转换为您的系统编码,从而弄乱您的整个二进制代码)虽然这样的事情对文本文件来说是很好的,但它会在二进制文件中产生问题。
幸运的是,只需要一个字符就可以解决这个问题:b作为open的修饰符
编辑:我刚刚在Tcl的change list中查找了一下,open的b修饰符添加了8.5。我通常只使用8.5或8.6,所以如果您使用的是旧版本的Tcl,请在open后面添加以下代码:
fconfigure $trace_file_id -translation binaryb修饰符只是一个快捷方式。
https://stackoverflow.com/questions/15118966
复制相似问题