home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / comp / lang / c / 13086 < prev    next >
Encoding:
Internet Message Format  |  1992-09-01  |  2.5 KB

  1. Path: sparky!uunet!elroy.jpl.nasa.gov!usc!sol.ctr.columbia.edu!destroyer!ncar!noao!amethyst!organpipe.uug.arizona.edu!news
  2. From: dave@cs.arizona.edu (Dave Schaumann)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: HELP !! Converting non printable characters to HEX
  5. Message-ID: <1992Sep2.000227.21792@organpipe.uug.arizona.edu>
  6. Date: 2 Sep 92 00:02:27 GMT
  7. References: <1992Sep1.152149.1905@cs.uow.edu.au>
  8. Sender: news@organpipe.uug.arizona.edu
  9. Reply-To: dave@cs.arizona.edu (Dave Schaumann)
  10. Organization: University of Arizona
  11. Lines: 68
  12. In-Reply-To: u8705957@cs.uow.edu.au (Hitesh Sanghvi)
  13.  
  14. In article <1992Sep1.152149.1905@cs.uow.edu.au>, u8705957@cs (Hitesh Sanghvi) writes:
  15. >Hi there;
  16. >    Any suggestion or 'c' code on how to convert non printable 
  17. >characters to hex.
  18. >My function works for printable ascii characters but does not work
  19. >on non printable characters.
  20. >
  21. >My code is as follows:
  22. >
  23. >void
  24. >dec_to_hex(sin,sout)
  25. >unsigned char sin[],sout[];
  26. >{
  27. >    int loop,i;
  28. >
  29. >    for (loop = 0;loop<4;loop++)
  30. >    {
  31. >        i = (int)sin[loop];
  32. >        sprintf(&(sout[2*loop]),"%02x",i);
  33. >    }
  34. >}
  35. >so it takes 4 ch and gives me 8 hex ch onlly when ascii ch is entered.
  36.  
  37. Well, I don't know why your code doesn't work for you.  I tried it out,
  38. and it seems to work fine for me.  However, there are a several things
  39. I would change about your code:
  40.  
  41. >dec_to_hex(sin,sout)
  42.             ^^^
  43. sin is the name of a function defined by the math library.  Although you can
  44. do it, it's poor form to have variables (or functions) with the same name as
  45. library functions.
  46.  
  47. >unsigned char sin[],sout[];
  48.                   ^^     ^^
  49. >    for (loop = 0;loop<4;loop++)
  50.                            ^
  51. Hard coding magic numbers is a big mistake.  Get in the habit of using #define.
  52.  
  53. Also, IMHO, this function would be much simpler and ultimately more practical
  54. if it only worked on one character at a time, and if it returned its value.
  55. you can pass an array for the result if you want, but I find it tends to be
  56. useful to return values as well (it also costs very little to do so).
  57.  
  58. With these comments in mind, I would write this code thusly:
  59.  
  60. unsigned char *char2hex( unsigned char c, unsigned char *buff ) {
  61.  
  62.   sprintf( buf, "%02x", (int)c ) ;
  63.   return buf ;
  64.   }
  65.  
  66. Really, this is so simple, you might as well make it a macro:
  67.  
  68. /* note the use of the comma operator so that buf is still "returned" */
  69. #define CHAR2HEX( c, buf )  ((buf), sprintf( (buf), "%02x", (int)(c) ))
  70.  
  71. Now, your original loop could be written as
  72.  
  73.   #define N 4
  74.  
  75.   int i ;
  76.   
  77.   for( i = 0 ; i < N ; i++ )
  78.     CHAR2HEX( s_in[i], s_out[i*2] ) ;
  79.  
  80. -- 
  81. Caught an internal error--.brainrc restored
  82.