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 antonHello 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
signature.asc
Description: OpenPGP digital signature