【问题标题】:Bad file size in video.dat in ns-2ns-2 中 video.dat 中的文件大小错误
【发布时间】:2013-02-27 17:56:41
【问题描述】:

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

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) 文档中找到它,或者它已经过时并且现在不受支持。

【问题讨论】:

  • 所以我终于做到了。实际上,ns-2 Application/Traffic/Trace 的跟踪文件中的记录包含 2 个网络字节顺序的 32 位整数。第一个整数以微秒为单位给出时间,第二个整数以字节为单位给出数据包大小。 tcl 脚本二进制格式“II”在我阅读时无法将其转换为这种格式。所以我所做的只是编写了一个 C 程序并将电影文件跟踪转换为所需的二进制格式,然后在 ns-2 模拟中使用它并且它工作。

标签: tcl binaryfiles ns2


【解决方案1】:

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

改变

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 的修饰符

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

fconfigure $trace_file_id -translation binary

b 修饰符只是一个快捷方式。

【讨论】:

    猜你喜欢
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    相关资源
    最近更新 更多