Here is what I currently have so far:
void WriteHexToFile( std::ofstream &stream, void *ptr, int buflen, char *prefix )
{
unsigned char *buf = (unsigned char*)ptr;
for( int i = 0; i < buflen; ++i ) {
if( i % 16 == 0 ) {
stream << prefix;
}
stream << buf[i] << ' ';
}
}
I've tried doing stream.hex, stream.setf( std::ios::hex ), as well as searching Google for a bit. I've also tried:
stream << stream.hex << (int)buf[i] << ' ';
But that doesn't seem to work either.
Here is an example of some output that it currently produces:
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í
I would like the output to look like the following:
FF EE DD CC BB AA 99 88 77 66 55 44 33 22 11 00
FF EE DD CC BB AA 99 88 77 66 55 44 33 22 11 00
FF EE DD CC BB AA 99 88 77 66 55 44 33 22 11 00
FF EE DD CC BB AA 99 88 77 66 55 44 33 22 11 00
FF EE DD CC BB AA 99 88 77 66 55 44 33 22 11 00
FF EE DD CC BB AA 99 88 77 66 55 44 33 22 11 00
From stackoverflow
-
char upperToHex(int byteVal) { int i = (byteVal & 0xF0) >> 4; return nibbleToHex(i); } char lowerToHex(int byteVal) { int i = (byteVal & 0x0F); return nibbleToHex(i); } char nibbleToHex(int nibble) { const int ascii_zero = 48; const int ascii_a = 65; if((nibble >= 0) && (nibble <= 9)) { return (char) (nibble + ascii_zero); } if((nibble >= 10) && (nibble <= 15)) { return (char) (nibble - 10 + ascii_a); } return '?'; }More code here.
-
I usually make a function which returns the digits and just use it:
void CharToHex(char c, char *Hex) { Hex[0]=HexDigit(c>>4); Hex[1]=HexDigit(c&0xF); }char HexDigit(char c) { if(c<10) return c; else return c-10+'A'; }
-
#include <iostream> using namespace std; int main() { char c = 123; cout << hex << int(c) << endl; }Edit: with zero padding:
#include <iostream> #include <iomanip> using namespace std; int main() { char c = 13; cout << hex << setw(2) << setfill('0') << int(c) << endl; }kitchen : Won't that just output it to the console?Rob Kennedy : Could you explain why that should work any differently from using stream.hex, like the asker already tried?Arnold Spence : I find the 'hex' stream modifier a bit of a pain. If you are outputting other types you have to keep switching the stream back (using 'dec' for example) and as far as I know, it doesn't do leading zeros.anon : @kitchen - replace cout with your own stream.anon : @rob because the OP's code is wrong?kitchen : @Neil: It worked, but what's the difference between using ofstream.hex and std::hex?Rob Kennedy : OK, I'll explain it myself. Using stream.hex prints the value of the member-function pointer ostream::hex. (For me the value is 8.) Then it prints the integer value of the character in decimal.anon : @rob the hex manipul;ator is not a member of the stream class. The hex you are printing is acually an enumeration valueMr.Ree : You might want to use unsigned(c) instead of int(c) if c<0.Johannes Schaub - litb : mrree better (int)(unsigned char)c :)RBerteig : And this is why I *love* C++ streams: cout << hex << setw(2) << setfill('0') << int(c) << endl is just *so* much clearer than printf("%02x", c) ;-) I know its typesafe(er) but couldn't they have dreamed up something less grotesque?Edouard A. : Clarity is a question of point of view... I don't think printf("%02x", c) can be considered as "clear"Mr.Ree : litb: You're right. Or perhaps int(c)&0xff -
You simply need to configure your stream once:
stream << std::hex << std::setfill('0') << std::setw(2) -
Try:
#include <iomanip> .... stream << std::hex << static_cast<int>(buf[i]); -
You can also do it using something a bit more old-fashioned:
char buffer[3];//room for 2 hex digits and \0 sprintf(buffer,"%02X ",onebyte);
0 comments:
Post a Comment