Hex: Difference between revisions
Jump to navigation
Jump to search
Line 5: | Line 5: | ||
== Read an integer from an hex string == |
== Read an integer from an hex string == |
||
(See [http://stackoverflow.com/questions/1070497/c-convert-hex-string-to-signed-integer], [http://stackoverflow.com/questions/10324/how-can-i-convert-a-hexadecimal-number-to-base-10-efficiently-in-c]). |
(See [http://stackoverflow.com/questions/1070497/c-convert-hex-string-to-signed-integer], [http://stackoverflow.com/questions/10324/how-can-i-convert-a-hexadecimal-number-to-base-10-efficiently-in-c]). |
||
=== Homebrew === |
|||
<div style="column-width:36em"> |
|||
<source lang="c"> |
|||
const char _hex[] = "0123456789ABCDEF"; |
|||
// Change a 0x0A into 'A' |
|||
char itoh(int nibble) |
|||
{ |
|||
return _hex[nibble]; |
|||
} |
|||
// Change a 'A' into 0x0A |
|||
int htoi(char hex) |
|||
{ |
|||
int isletter = (hex & 0x40) >> 6; |
|||
return (isletter | (isletter << 3)) + ( hex & 0x0F ); |
|||
} |
|||
// Change "A010" into 0xA010 |
|||
template<class T> |
|||
T hextoint_BE(string h) |
|||
{ |
|||
T i=0; |
|||
for(string::const_iterator it=h.begin(); it!=h.end(); ++it) |
|||
{ |
|||
i=(i<<4)|htoi(*it); |
|||
} |
|||
return i; |
|||
} |
|||
// Change "A010" into "\xA0\x10" |
|||
string hextostring_BE(const string& h) |
|||
{ |
|||
string x; |
|||
for(unsigned int i=0; (i+1)<h.length(); i+=2) { |
|||
x += (htoi(h[i]) << 4)+ htoi(h[i+1]); |
|||
} |
|||
return x; |
|||
} |
|||
// Change 0xA010 into "A010" |
|||
template<class T> |
|||
string inttohex_BE(T i, unsigned int size) |
|||
{ |
|||
string sh; |
|||
while( i > 0 ) |
|||
{ |
|||
sh = itoh(i&0xF) + sh; |
|||
i>>=4; |
|||
} |
|||
if(!size) |
|||
return sh; |
|||
if(size<sh.length()) |
|||
return string(sh,sh.length()-size,size); |
|||
else |
|||
return string(size-sh.length(),'0')+sh; |
|||
} |
|||
// Change "\xA0\x10" into "A010" |
|||
string stringtohex_BE(const string& s, unsigned int size) |
|||
{ |
|||
string h; |
|||
for(string::const_iterator it=s.begin();it!=s.end();++it) |
|||
{ |
|||
h += itoh((*it & 0xF0) >> 4); |
|||
h += itoh((*it & 0x0F) >> 0); |
|||
} |
|||
if(!size) |
|||
return h; |
|||
if(size<h.length()) |
|||
return string(h,h.length()-size,size); |
|||
else |
|||
return string(size-h.length(),'0')+h; |
|||
} |
|||
</source> |
|||
</div> |
|||
=== Using atol === |
=== Using atol === |
||
<source lang="c"> |
<source lang="c"> |
Revision as of 08:39, 4 October 2011
References
Many examples come from cplusplus.com and stackoverflow.com.
C / C ++
Read an integer from an hex string
Homebrew
const char _hex[] = "0123456789ABCDEF";
// Change a 0x0A into 'A'
char itoh(int nibble)
{
return _hex[nibble];
}
// Change a 'A' into 0x0A
int htoi(char hex)
{
int isletter = (hex & 0x40) >> 6;
return (isletter | (isletter << 3)) + ( hex & 0x0F );
}
// Change "A010" into 0xA010
template<class T>
T hextoint_BE(string h)
{
T i=0;
for(string::const_iterator it=h.begin(); it!=h.end(); ++it)
{
i=(i<<4)|htoi(*it);
}
return i;
}
// Change "A010" into "\xA0\x10"
string hextostring_BE(const string& h)
{
string x;
for(unsigned int i=0; (i+1)<h.length(); i+=2) {
x += (htoi(h[i]) << 4)+ htoi(h[i+1]);
}
return x;
}
// Change 0xA010 into "A010"
template<class T>
string inttohex_BE(T i, unsigned int size)
{
string sh;
while( i > 0 )
{
sh = itoh(i&0xF) + sh;
i>>=4;
}
if(!size)
return sh;
if(size<sh.length())
return string(sh,sh.length()-size,size);
else
return string(size-sh.length(),'0')+sh;
}
// Change "\xA0\x10" into "A010"
string stringtohex_BE(const string& s, unsigned int size)
{
string h;
for(string::const_iterator it=s.begin();it!=s.end();++it)
{
h += itoh((*it & 0xF0) >> 4);
h += itoh((*it & 0x0F) >> 0);
}
if(!size)
return h;
if(size<h.length())
return string(h,h.length()-size,size);
else
return string(size-h.length(),'0')+h;
}
Using atol
/* atol example */
#include <stdio.h>
#include <stdlib.h>
int main ()
{
long int li;
char szInput [256];
printf ("Enter a long number: ");
gets ( szInput );
li = atol (szInput);
printf ("The value entered is %d. The double is %d.\n",li,li*2);
return 0;
}
Using strtol, strtoll
strtol
(resp. strtoll
) returns LONG_MIN, LONG_MAX (resp. LLONG_MIN, LLONGMAX) in case of under/overflow.
/* strtol example */
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff";
char * pEnd;
long int li1, li2, li3, li4;
li1 = strtol (szNumbers,&pEnd,10);
li2 = strtol (pEnd,&pEnd,16);
li3 = strtol (pEnd,&pEnd,2);
li4 = strtol (pEnd,NULL,0);
printf ("The decimal equivalents are: %ld, %ld, %ld and %ld.\n",
li1, li2, li3, li4);
return 0;
}
#include <cstdlib>
#include <iostream>
using namespace std;
int main() {
string s = "abcd";
char * p;
long n = strtol( s.c_str(), & p, 16 );
if ( * p != 0 ) {
cout << "not a number" << endl;
}
else {
cout << n << endl;
}
}
Using strtoul, strtoull
Use strtoul
(resp. strtoull
) when value to read is greater than numeric_limits<long>::max()
(resp. numeric_limits<long long>::max()
).
/* strtoul example */
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char szInput [256];
unsigned long ul;
printf ("Enter an unsigned number: ");
fgets (szInput,256,stdin);
ul = strtoul (szInput,NULL,0);
printf ("Value entered: %lu. Its double: %lu\n",ul,ul*2);
return 0;
}
#include <cstdlib>
#include <iostream>
using namespace std;
int main() {
string s = "fffefffe";
char * p;
long n = strtoul( s.c_str(), & p, 16 );
if ( * p != 0 ) {
cout << "not a number" << endl;
} else {
cout << n << endl;
}
}
Using sscanf
#include <stdio.h>
main()
{
char s[] = "fffffffe";
int x;
sscanf(s, "%x", &x);
printf("%u\n", x);
}
Using stringstream
#include <sstream>
#include <iostream>
int main() {
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
// output it as a signed type
std::cout << static_cast<int>(x) << std::endl;
}