Неверный размер файла в video.dat в ns-2

Я использую сценарий 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 ответ

Возможно, проблема в том, что вы не открываете свой файл в двоичном режиме.

+ Изменить

set trace_file_id [open $trace_file_name w]

в

set trace_file_id [open $trace_file_name wb]

В противном случае Tcl изменит выход, например, заменит \n с \r\n на окнах. (А для байтовых значений> 127 он будет обрабатываться как кодовая точка Unicode, затем преобразовываться в кодировку вашей системы и, таким образом, портить весь ваш двоичный материал). Хотя такие вещи хороши для текстовых файлов, это создает проблемы с двоичными файлами.

К счастью, для исправления требуется только один символ: b как модификатор для open

Изменить: я только что посмотрел в списке изменений для Tcl, b модификатор open был добавлен с 8.5. Я обычно использую только 8.5 или 8.6, поэтому, если вы используете более старую версию Tcl, добавьте следующую строку после открытия:

fconfigure $trace_file_id -translation binary

b Модификатор это просто ярлык для этого.

Другие вопросы по тегам