Неверный размер файла в 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
Модификатор это просто ярлык для этого.