更改二进制文件的内容

时间:2018-04-02 10:58:44

标签: tcl

我想在不读取和写入整个文件内容的情况下更改(大)二进制文件的内容。这就是我尝试过的:

#!/usr/bin/env tclsh
set f [open MyFile.txt w+]
fconfigure $f -translation binary
foreach c [split "MyText is ABC" ""] {
    puts -nonewline $f $c
}
seek $f 2 "start"
foreach c [split "Name" ""] {
    puts -nonewline $f $c
}
close $f

我创建了一个文件并将 Text 更改为 Name 。这很好。

但如果该文件已存在且我想使用以下程序将文本更改为名称

#!/usr/bin/env tclsh
set f [open MyFile.txt w+]
fconfigure $f -translation binary
seek $f 2 "start"
foreach c [split "Name" ""] {
    puts -nonewline $f $c
}
close $f

它不起作用。原因是 open filename w + 会截断文件。有人知道如何更改现有二进制文件的内容吗?

提前谢谢。

1 个答案:

答案 0 :(得分:2)

由于这是一个大型二进制文件,并且您不想更改大小,因此最好使用open模式字符串r+b; r+是读写而不截断(w+是读写初始截断,a+是读取追加,所以每次写入都到文件末尾){{1 }表示“二进制模式”。然后使用b移动到要写入的位置,并使用seek写出二进制字符串。二进制字符串可以通过多种方式制作,但关键字符串可以是puts -nonewlinebinary format

encoding convertto

上面的小脚本将文件# Open the file to write set f [open "foobar.bin" "r+b"] # Pick your offset to write to seek $f 10240 # Writes a pair of 4-byte integers in little-endian form puts -nonewline $f [binary format "i2" {123 345}] close $f 更新为10kiB的特定8个字节。这8个字节是123和345的小端4字节字。