E
ern
Does a function exist to convert a 128-bit hex number to a string?
Does a function exist to convert a 128-bit hex number to a string?
ern said:Does a function exist to convert a 128-bit hex number to a string?
Richard said:ern said:
There is no such thing as a "hex number". Hexadecimal is a numeric
representation system, not a kind of number.
If you have a hex representation, you already *have* a string, and
converting a string to a string is simple enough.
--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously)
If you have a hex representation, you already *have* a string, and
converting a string to a string is simple enough.
ern said:Does a function exist to convert a 128-bit hex number to a string?
Let me rephrase. I have a 128 bit value, which I would like to be
converted to a hexadecimally represented string.
Last time I checked... http://www.asciitable.com/
the string representation "4" has the hex value 0x34,
contradicting your above statement.
There is no library function to do that directly, but you can
write it easily enough if you are willing to assume a specific
character set (such as ASCII),
Walter said:ern said:Does a function exist to convert a 128-bit hex number to a string?
There is no library function to do that directly, but you can
write it easily enough if you are willing to assume a specific
character set (such as ASCII), and if you know the encoding
represented by the number.
For example, one that would work for one encoding combination is,
#include <stdio.h>
int main(void) {
const char hexnum[33] = "54686520616e73776572206973203432";
unsigned short tmpbuf[16];
int i;
sscanf( hexnum,
"%2hx%2hx%2hx%2hx%2hx%2hx%2hx%2hx%2hx%2hx%2hx%2hx%2hx%2hx%2hx%2hx",
&tmpbuf[0], &tmpbuf[1], &tmpbuf[2], &tmpbuf[3],
&tmpbuf[4], &tmpbuf[5], &tmpbuf[6], &tmpbuf[7],
&tmpbuf[8], &tmpbuf[9], &tmpbuf[10], &tmpbuf[11],
&tmpbuf[12], &tmpbuf[13], &tmpbuf[14], &tmpbuf[15] );
for (i=0; i<16; i++) printf("%c", (unsigned char) tmpbuf );
printf("\n");
return 0;
}
If my 128 bit value (represented hexadecimally) was:
4D9479E256DD4E8A923E32065141A911
I would want this function to populate a char buffer such that:
charBuffer = "4D9479E256DD4E8A923E32065141A911"
Richard said:ern said:
Let me rephrase. I have a 128 bit value, which I would like to be
converted to a hexadecimally represented string.
Okay. Since C doesn't guarantee the existence of 128-bit integer types, let
us assume that you have your value in an array of unsigned char, which we
will treat as a bit array.
Here's some preprocessing stuff:
#include <stddef.h>
#include <limits.h>
#define BYTE(x) ((x) / CHAR_BIT)
#define BIT(x) ((x) % CHAR_BIT)
#define SET_BIT(a, b) \
(a)[BYTE(b)] |= (1 << (BIT(b)))
#define CLEAR_BIT(a, b) \
(a)[BYTE(b)] &= ~(1 << (BIT(b)))
#define TEST_BIT(a, b) \
(!!(((a)[BYTE(b)]) & (1 << (BIT(b)))))
Okay, here's our routine, which requires a pointer to the first of len bytes
of input and a pointer to the first of len * 2 + 1 bytes of output. I
should warn you that I have *not* tested it very much! Especially the code
that deals with weird byte sizes. So it's likely to have a hole or two. But
it should give you the general idea, and is not limited to 128-bit inputs
(but if that is what you want and CHAR_BIT is 8, then this routine expects
len to be 16):
void to_hex(char *out, unsigned char *in, size_t len)
{
char hexabet[] = "0123456789ABCDEF";
size_t bits = len * CHAR_BIT;
size_t bit = 0;
int ch = 0;
if(bits & 7)
{
bit = bits & 7; bits &= ~7;
while(bit != 0)
{
ch <<= 1;
ch |= TEST_BIT(in, bit);
--bit;
}
*out++ = hexabet[ch];
}
for(; bit < bits; bit += 8)
{
*out++ = hexabet[(TEST_BIT(in, bit + 7) << 3) |
(TEST_BIT(in, bit + 6) << 2) |
(TEST_BIT(in, bit + 5) << 1) |
TEST_BIT(in, bit + 4)];
*out++ = hexabet[(TEST_BIT(in, bit + 3) << 3) |
(TEST_BIT(in, bit + 2) << 2) |
(TEST_BIT(in, bit + 1) << 1) |
TEST_BIT(in, bit)];
}
*out = '\0';
}
And here's a driver:
#include <stdio.h>
int main(void)
{
unsigned char in[] =
{
0x4D, 0x94, 0x79, 0xE2,
0x56, 0xDD, 0x4E, 0x8A,
0x92, 0x3E, 0x32, 0x06,
0x51, 0x41, 0xA9, 0x11
};
char out[33] = {0};
to_hex(out, in, 16);
printf("%s\n", out);
return 0;
}
Last time I checked... http://www.asciitable.com/
ASCII has nothing to do with C.
the string representation "4" has the hex value 0x34,
You seem to be confusing character sets, representations, and values. The
string "4" comprises two bytes, { '4', '\0' }. The code point of '4' is
implementation-defined. On some systems it is indeed 0x34, but on others
it's 0xF4 or some other value.
contradicting your above statement.
If it contradicts what I said, then it's wrong, because what I said is
right.
--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously)
ern said:Does a function exist to convert a 128-bit hex number to a string?
ern said:Let me make the problem simpler. Say I have a 32-bit integer. I what
the hexadecimally represented string version.
So the integer is the INPUT, and the hexadecimally represented string
is the OUTPUT.
Michal Nazarewicz said:Anyways, you probably ask for:
void binary2hex(const char *data, size_t len, char *buffer) {
ern said:Thanks for the code, but that's the inverse of what I need.
Let me make the problem simpler. Say I have a 32-bit integer. I what
the hexadecimally represented string version.
So the integer is the INPUT, and the hexadecimally represented string
is the OUTPUT.
We miss you, Dan. ElijahBen Pfaff said:What format is the number in to start out with? I ask because
it's strange to specify that a number is in hex if it's simply in
an integer variable. Normally, one thinks of a numeric variable
as simply having a value, and the base is not important. Also: C
doesn't guarantee the existence of an 128-bit integer type.
Want to reply to this thread or ask your own question?
You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.