【发布时间】:2015-08-27 11:41:56
【问题描述】:
我通常是一个读者,但这次我找不到答案。 我有一些由科学设备生成的技术文件。 有时,记录的文件会损坏,我们必须手动进行一些十六进制修改。 我想知道如何实现自动化。 我在考虑 Perl,因为我对此有所了解,但即使我设法读取了感兴趣的偏移量,我也不知道如何编写新值。
我有两件事要做:
- 在偏移量 4 处写入文件大小减 8
- 计算“TRCKfmt”模式的数量,即 5452434B666D74 十六进制值,然后在偏移量 5C (92) 处记下十六进制值。
我尝试在文件句柄上使用sysread 和syswrite,但我无法完成不同的步骤。
也许Perl不是一个好选择,我不知道如何解决。
这是我的实际脚本:
use warnings;
use strict;
use diagnostics;
use Fcntl qw(:seek);
my($fh, $filename, $byte_position, $byte_value);
$filename = "MYFILE.tac";
$byte_position = 4;
my $filesize = -s $filename;
print "Size: $filesize\n";
open($fh, "<", $filename)
|| die "can't open $filename: $!";
binmode($fh)
|| die "can't binmode $filename";
sysseek($fh, $byte_position, SEEK_CUR) # NB: 0-based
|| die "couldn't see to byte $byte_position in $filename: $!";
sysread($fh, $byte_value, 1) == 1
|| die "couldn't read byte from $filename: $!";
printf "read byte with ordinal value %#02x at position %d\n",
ord($byte_value), $byte_position;
感谢您的帮助。
【问题讨论】:
-
重新“在偏移量 4 处写入”,为了清楚起见,您想覆盖已经存在的内容吗?
-
@Sinan Ünür,这不是真的。如果他试图覆盖文件的某些部分,他可以在他试图做的时候寻找并打印需要更改的字节。这样做只需要多做一点工作。
-
是的,
<必须更改为<+ -
谢谢大家的回答。确实,我想覆盖实际值。
标签: windows perl scripting hex scientific-software