Article View: comp.sources.atari.st
Article #477v02i035: hexify -- Hexidecimal encode/decode for mailing binaries
From: Steven Grimm
Date: Wed, 29 Mar 1989 23:54
Date: Wed, 29 Mar 1989 23:54
145 lines
4042 bytes
4042 bytes
Submitted-by: ntomczak@ualtavm.bitnet (Michal Jaegermann)
Posting-number: Volume 2, Issue 35
Archive-name: hexify
[Uuencode is much more efficient, but you can use this to send binaries
across troublesome networks, such as BITNET (sometimes). -sg]
Here are two C programs which I used to perform a conversion to hex
and back. Binary restorer is smart enough to find a "BEGIN" line and
create file name. Both programs will compile with Sozobon C and dLibs
library (and many other compilers, I bet). [SunOS 4.0's, for one... -sg]
#!/bin/sh
# shar: Shell Archiver (v1.22)
#
# Run the following text with /bin/sh to create:
# dehex.c
# hexify.c
#
sed 's/^X//' << 'SHAR_EOF' > dehex.c &&
X/*
X * Hex-to-binary utility -- conquer BITNET mailers!!
X *
X * Restore binary file from a text file with hexadecimal digits
X *
X * Michal Jaegermann, 19 March 1989
X */
X
X#include <stdio.h>
X#include <string.h>
X#define BSIZE 128
X
Xmain(argc, argv)
Xint argc;
Xchar **argv;
X{
X int ch, count = 0;
X FILE *fin, *fout;
X char inbuf[BSIZE+2];
X char outname[14];
X
X if (argc != 2) {
X fprintf(stderr, "usage: %s <infile>\n", argv[0]);
X exit(1);
X }
X
X if (NULL == (fin = fopen(argv[1],"r"))){
X fprintf(stderr, "cannot find input file %s\n", argv[1]);
X exit(1);
X }
X /* search for BEGIN line */
X for(;;) {
X if (NULL == fgets(inbuf, BSIZE, fin)){
X fprintf(stderr, "No BEGIN line\n");
X fclose(fin);
X exit(1);
X }
X sscanf(inbuf, " %12s", outname);
X if (0 == strcmp("BEGIN", outname)) break;
X if ('\n' != inbuf[strlen(inbuf) - 1]) {
X while ('\n' != (ch = getc(fin))) {
X ; /* eat a remainder of a line */
X }
X }
X }
X
X /* get an output file name */
X sscanf(inbuf, " %*5s %12s", outname);
X
X if (NULL == (fout = fopen(outname,"wb"))){
X fprintf(stderr, "cannot open output file %s", outname);
X fclose(fin);
X exit(1);
X }
X
X /* do the actual job */
X while (1 == fscanf(fin, " %02x", &ch)) {
X putc((char) ch, fout);
X }
X fclose(fout);
X
X /* just a check for completeness */
X fscanf(fin, " %3s", inbuf);
X if (0 != strcmp("ND", inbuf)) { /* a little bit of cheating */
X fprintf(stderr, "%s -- END line not found in %s\n",
X inbuf, argv[1]);
X }
X fclose(fin);
X exit(0);
X}
X
SHAR_EOF
chmod 0600 dehex.c || echo "restore of dehex.c fails"
sed 's/^X//' << 'SHAR_EOF' > hexify.c &&
X/*
X * Binary-to-hex utility -- conquer BITNET mailers!!
X *
X * Rewrite binary file as a text file containing hexadecimal
X * digits
X *
X * Michal Jaegermann, 19 March 1989
X */
X
X#include <stdio.h>
X/* LWIDTH bytes --- will put twice as many characters on output line */
X#define LWIDTH 32
X
Xmain(argc, argv)
Xint argc;
Xchar **argv;
X{
X int ch, count = 0;
X FILE *fin, *fout;
X
X if (argc != 3) {
X fprintf(stderr, "usage: %s <infile> <outfile>\n", argv[0]);
X exit(1);
X }
X
X if (NULL == (fin = fopen(argv[1],"rb"))){
X fprintf(stderr, "cannot find input file %s", argv[1]);
X }
X if (NULL == (fout = fopen(argv[2],"w"))){
X fprintf(stderr, "cannot open output file %s", argv[2]);
X }
X
X fprintf(fout, "BEGIN %s\n", argv[1]);
X while (EOF != (ch = getc(fin))) {
X fprintf(fout, "%02x", (unsigned) ch);
X if (LWIDTH == (++count)) {
X count = 0;
X fprintf(fout,"\n");
X }
X }
X fprintf(fout, "\nEND\n");
X /*
X * we do not care if we have an extra new line - restore
X * utility will gobble it in any case
X */
X exit(0);
X}
X
SHAR_EOF
chmod 0600 hexify.c || echo "restore of hexify.c fails"
exit 0
Technical Details
Message-ID:
<6801@saturn.ucsc.edu>Path:
arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!csd4.milw.wisc.edu!bionet!agate!saturn!ssyx.ucsc.edu!korethShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!csd4.milw.wisc.edu!bionet!agate!saturn!ssyx.ucsc.edu!koreth From: koreth@ssyx.ucsc.edu (Steven Grimm) Newsgroups: comp.sources.atari.st Subject: v02i035: hexify -- Hexidecimal encode/decode for mailing binaries Keywords: shar, C Message-ID: <6801@saturn.ucsc.edu> Date: 29 Mar 89 23:54:59 GMT Sender: usenet@saturn.ucsc.edu Lines: 145 Approved: koreth@ssyx.ucsc.edu