ftp.nice.ch/pub/next/tools/calculators/SciCalc.1.1.s.tar.gz#/SciCalc-1.1/str_hexbin.c

This is str_hexbin.c in view mode; [Download] [Up]

/******************************************************************************
*H* str_hexbin.c {Hex string value <-> Binary string value  } V1.0, 20-APR-91 *
*C* 1.0 20-APR-91 Initial Version   	    	    	    	    	--MDM *
******************************************************************************/

#include <string.h>      /* Standard C string operator function prototypes */


/******************************************************************************
* FUNCTION: STR_HexToBinary	    	    	    	    	    	      *
*   This function converts a  formated  Hex value to a formated binary value. *
* The hex string is scanned from  left to right translating each character in *
* 0-F range by appending  the  appropriate  4  digit  binary  sequence to the *
* binary output string.   The  binary  output  string  is expected to be have *
* enough space to contain the results.	    	    	    	    	      *
******************************************************************************/
void STR_HexToBinary

    (/* Arguments */
    char *hexstr,   	/*I Pointer to hex value input string */
    char *binstr)   	/*I Pointer to binary value output string */

{/* BEGIN STR_HexToBinary */
*binstr = 0;

while (*hexstr)
    {
    switch (*hexstr)
        {
	case '0':  strcat(binstr, "0000"); break;
	case '1':  strcat(binstr, "0001"); break;
	case '2':  strcat(binstr, "0010"); break;
	case '3':  strcat(binstr, "0011"); break;
	case '4':  strcat(binstr, "0100"); break;
	case '5':  strcat(binstr, "0101"); break;
	case '6':  strcat(binstr, "0110"); break;
	case '7':  strcat(binstr, "0111"); break;
	case '8':  strcat(binstr, "1000"); break;
	case '9':  strcat(binstr, "1001"); break;
    	case 'a':
	case 'A':  strcat(binstr, "1010"); break;
    	case 'b':
	case 'B':  strcat(binstr, "1011"); break;	
    	case 'c':
    	case 'C':  strcat(binstr, "1100"); break;
    	case 'd':
	case 'D':  strcat(binstr, "1101"); break;
    	case 'e':
	case 'E':  strcat(binstr, "1110"); break;
    	case 'f':
	case 'F':  strcat(binstr, "1111"); break;
        }
    hexstr++;
    }/*while*/
}/* END STR_HexToBinary */



/******************************************************************************
* FUNCTION: STR_BinaryToHex	    	    	    	    	    	      *
*   This function converts a  formated  Binary value to a formated Hex value. *
* The binary string is scanned  from right  to left translating each group of *
* four binary digits to an  appropriate hex digit.  The hex digits are placed *
* in the output  string  in  reverse  order.   Thus  the resultant hex output *
* string is reversed prior to returning to the caller.  The hex output string *
* is expected to have enough space to contain the results.   	    	      *
******************************************************************************/
void STR_BinaryToHex

    (/* Arguments */
    char *binstr,   	/*I Pointer to binary value input string */
    char *hexstr)   	/*I Pointer to octal value output string */

{   /* Local Variables */
    int  binidx;    /* current parsing position in binary input string */
    char *hexdgt;   /* Sequential set of hex digit characters */
    int  hexidx;    /* current output position hex string */
    char hexval;    /* current value of hex digit being formatted */
    char power;	    /* hex digit bit position power of two (1,2,4,8,...) */

/* BEGIN STR_BinaryToHex */
binidx = strlen(binstr) - 1;
power  = 1;
hexidx = 0;
hexval = 0;
hexdgt = "0123456789ABCDEF";

while ( binidx >= 0 )
    {/* Continue until we reach the start of binary input string */
    if ( *(binstr+binidx) == '1' )
    	/* Add this bits place value to current hex digit value */
    	hexval += power;

    /* increase next bit positions place value for hex digit */
    power = power << 1;

    if ( power > 8 || binidx == 0 )
    	{/* We have checked four bits, kick out a hex digit */
    	*(hexstr+hexidx) = hexdgt[hexval];
       	hexidx++;
    	power  = 1;
    	hexval = 0;
        }
    binidx--;
    }
*(hexstr+hexidx) = 0;	    /* null terminate output string */

/* Now reverse the order of the octal digits so they make sense */
for (binidx = 0; binidx < hexidx/2; binidx++)
    {/* Swap chars at respective ends of string, until middle is reached */
    hexval                    = *(hexstr+binidx);
    *(hexstr+binidx)          = *(hexstr+hexidx-binidx-1);
    *(hexstr+hexidx-binidx-1) = hexval;
    }
}/* END STR_BinaryToHex */

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.