2009-03-08 12 views
14

यहां वर्तमान में मेरे पास अभी तक है:एएससीआईआई में एक पाठ फ़ाइल में एक char के हेक्स मान कैसे लिखते हैं?

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] << ' '; 
    } 
} 

मैंने stream.hex, stream.setf (std :: ios :: हेक्स) करने के साथ-साथ Google को थोड़ा सा खोज करने का प्रयास किया है। मैंने यह भी कोशिश की है:

stream << stream.hex << (int)buf[i] << ' '; 

लेकिन ऐसा लगता है कि यह भी काम नहीं करता है।

यहां कुछ आउटपुट का एक उदाहरण दिया गया है जो वर्तमान में उत्पादित करता है:

Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í 
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í 
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í 
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í 
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í 
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í 

मैं आउटपुट को निम्न जैसा दिखाना चाहता हूं:

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 
+1

Btw: आप चाहिए यह सुनिश्चित करने के लिए कि आप इन बफर को संशोधित नहीं करेंगे, कॉन्स्ट शून्य * पीआरटी और कॉन्स char * उपसर्ग का उपयोग करें। – mmmmmmmm

+0

@ रिस्टवेन्स: ठीक है! – xian

+1

यही कारण है कि मुझे ढेर अतिप्रवाह पसंद है। इन मजेदार छोटी समस्याएं समय-समय पर आती हैं और कोई कोड के स्निपेट में गिरता है और इसका हल हो जाता है ... – MikeJ

उत्तर

25
#include <iostream> 
using namespace std; 
int main() { 
    char c = 123; 
    cout << hex << int(c) << endl; 
} 

संपादित करें: शून्य गद्दी के साथ:

#include <iostream> 
#include <iomanip> 
using namespace std; 
int main() { 
    char c = 13; 
    cout << hex << setw(2) << setfill('0') << int(c) << endl; 
} 
+0

क्या यह सिर्फ कंसोल पर आउटपुट नहीं करेगा? – xian

+0

क्या आप समझा सकते हैं कि क्यों stream.hex का उपयोग करने से किसी भी अलग तरीके से काम करना चाहिए, जैसे पूछने वाले ने पहले ही कोशिश की है? –

+0

मुझे 'हेक्स' स्ट्रीम संशोधक दर्द का थोड़ा सा लगता है। यदि आप अन्य प्रकारों को आउटपुट कर रहे हैं तो आपको स्ट्रीम को वापस स्विच करना होगा (उदाहरण के लिए 'dec' का उपयोग करना) और जहां तक ​​मुझे पता है, यह अग्रणी शून्य नहीं करता है। –

6
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 '?'; 
} 

अधिक कोड here

यहाँ कुछ उत्पादन कि यह वर्तमान का उत्पादन का एक उदाहरण है।

0

मैं आमतौर पर एक समारोह जो अंक देता है और बनाने के बस का उपयोग करें:

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'; 
} 
-1

आप बस अपनी स्ट्रीम कॉन्फ़िगर करने की आवश्यकता एक बार:

stream << std::hex << std::setfill('0') << std::setw(2) 
+4

-1 [यह गलत है] (http://www.ideone.com/Xwjtz)। यह दो साल से डाउनवोट्स से कैसे बचा है ?! –

1

प्रयास करें:

#include <iomanip> 
.... 
stream << std::hex << static_cast<int>(buf[i]); 
1

तुम भी यह थोड़ा अधिक पुराने जमाने कुछ जरिए कर सकते हैं: wchar_t को

char buffer[3];//room for 2 hex digits and \0 
sprintf(buffer,"%02X ",onebyte); 
0

CHAR (यूनिकोड) हेक्स स्ट्रिंग

wchar_t* CharToWstring(CHAR Character) 
{ 
wchar_t TargetString[10]; 
swprintf_s(TargetString, L"%02X", Character); 

// then cut off the extra characters 
size_t Length = wcslen(TargetString); 

wchar_t *r = new wchar_t[3]; 
r[0] = TargetString[Length-2]; 
r[1] = TargetString[Length-1]; 
r[2] = '\0'; 
return r; 
} 
संबंधित मुद्दे