editing a binary file
Matthew Seaman
m.seaman at infracaninophile.co.uk
Fri Dec 18 08:28:04 UTC 2009
Anton Shterenlikht wrote:
> On Fri, Dec 18, 2009 at 02:09:58AM +0100, Rolf Nielsen wrote:
>> Anton Shterenlikht wrote:
>>> I'm creating binary files in fortran.
>>> Fortran adds 4 byte record delimiters at the beginning
>>> and the end of each record, which, in the case of a binary
>>> file, is just at the beginning and at the end of the file.
>>> I need to delete these record delimiters, because the
>>> software I use to visualise the binary files interprets
>>> them as data. But I don't know how. I've looked at
>>> hexdump and od, but those are only dumping (I think)
>>> file contents, and I cannot see how to edit a file with them.
>>>
>>> Any advice?
>>>
>>> many thanks
>>> anton
>>>
>> Hello Anton,
>>
>> My bet would be /usr/ports/editors/hexedit. Been a while since I've used
>> it, but AFAIR, it has a curses or a curses like interface, and it's
>> fairly simple to use, yet sufficiently powerful for most normal binary
>> editing. If you want a GUI, I believe gnome (and probably KDE as well)
>> has its own hex editor.
>
> thank you. hexedit does the job on small files, but is quite
> clunky. If I've a xGB file and I need to delete the first and
> the last record, this becomes quite hard, if at all possible.
>
> I didn't appreciate it's not that simple.
>
> Perhaps I can read a file with C and write back? I can't
> remember if C supports binary files, and whether it
> also writes some record delimiters.
Sure, you can write a fairly short C program to do this. In fact,
it's pretty easy in perl too:
#!/usr/bin/perl -w
use Fcntl;
use constant BUFFSIZ => 4096;
for my $file (@ARGV) {
my $buffer = '';
my $bytes_read = 0;
sysopen INFILE, $file, O_RDONLY
or die "Failed to open file $file for reading -- $!\n";
sysseek INFILE, 4, 0; # skip first 4 bytes
sysopen OUTFILE, "${file}.out", O_WRONLY|O_CREAT
or die "Failed to open file ${file}.out for writing -- $!\n";
while ( $bytesread = sysread INFILE, $buffer, BUFFSIZ, 0 ) {
# If we don't read 4096 bytes, try a second read: if this
# returns zero, then we're at EOF
if ( $bytes_read < BUFFSIZ ) {
my $offset = $bytes_read;
$bytes_read = sysread INFILE, $buffer, BUFFSIZ, $offset;
if ( $bytes_read == 0 ) {
# Trim the last 4 bytes
substr ($buffer, -4) = ''; # Trim off last 4 bytes
}
}
syswrite OUTFILE, $buffer;
}
close INFILE;
close OUTFILE;
}
Untested, and needs more error checking around those sysread()s and syswrite()s,
but it should give you the general idea.
Cheers,
Matthew
--
Dr Matthew J Seaman MA, D.Phil. 7 Priory Courtyard
Flat 3
PGP: http://www.infracaninophile.co.uk/pgpkey Ramsgate
Kent, CT11 9PW
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 259 bytes
Desc: OpenPGP digital signature
Url : http://lists.freebsd.org/pipermail/freebsd-questions/attachments/20091218/9147cc52/signature.pgp
More information about the freebsd-questions
mailing list