Path: utzoo!attcan!uunet!samsung!emory!gatech!mcnc!rti!mozart!sasrer From: sasrer@unx.sas.com (Rodney Radford) Newsgroups: comp.lang.c Subject: Re: Summary: Converting ascii hex to pure hex values Message-ID: <1990Nov09.182519.20436@unx.sas.com> Date: 9 Nov 90 18:25:19 GMT References: <302@cti1.UUCP> Distribution: comp Organization: SAS Institute Inc. Lines: 68 In article <302@cti1.UUCP> mpledger@cti1.UUCP (Mark Pledger) writes: >I sure caused alot of traffic for this little question. > >Thanks to everyone who responded. > >I guess I did'nt make myself clear enough on my question though. I know I >can use scanf() or cast a char to int (for a single char). I DID'NT want to >use scanf() and casting does not work for my question. The original question >went something like this: If you have a character string with the ascii >representation of hex values (e.g. s[] = "63", which will be stored as TWO >hex byte values \x9 & \x9. I only want to store them as ONE hex byte of \x63. >Without using scanf() (or even sprintf()) what is the best (fasted for me) way >to convert a two-digit ascii code to a one digit hex code, so I can put it back >into the charater string s[], append a null, and write it back out to disk. I >currently use atoi() and just write out the int to disk. I am interested in >creating (or finding) a routine that will take a character string as the >argument, and returning the hex result in the same character string. > >Any suggestions? I think the following routine (and it's test program) will do what you want... /**********************************************************************/ /* Simple test program for the function atohex() below. */ /**********************************************************************/ main() { char test_string[] = "3132332e2E2E20697420776F726B7321"; printf("input ascii string is................ '%s'\n", test_string); atohex(test_string); printf("output converted string is........... '%s'\n", test_string); } /**********************************************************************/ /* Author: Rodney Radford SAS Institute, Cary, NC 27513 */ /**********************************************************************/ /* The following function atohex() converts the printable hex string, */ /* that is it's first argument, into a new string, whose length is */ /* 1/2 the original string's length, of the decoded hex values (???). */ /**********************************************************************/ /* ASSUMPTION: in it's current form, this routine assumes that the */ /* input strings length is even. If this not ALWAYS true then you */ /* should #define NOT_SURE_ABOUT_EVEN_LENGTH. */ /* This also assumes the ASCII character set, but can be in either */ /* upper or lower case. */ /**********************************************************************/ #define ASCTOHEX(c) (((c) > '9') ? (((c)&0x1F)+9) : ((c)-'0')) atohex(s) char *s; { char *source,*dest; for (source=dest=s; *source; source+=2,dest++) { #ifdef NOT_SURE_ABOUT_EVEN_LENGTH if (*(source+1) == '\0') break; #endif *dest = (ASCTOHEX(*source)<<4) + ASCTOHEX(*(source+1)); } *dest = '\0'; } -- Rodney E. Radford SAS Institute, Inc. sasrer@unx.sas.com DG/UX AViiON developer Box 8000, Cary, NC 27512 (919) 677-8000 x7703