代码之家  ›  专栏  ›  技术社区  ›  xian

如何将ASCII字符的十六进制值写入文本文件?

  •  15
  • xian  · 技术社区  · 16 年前

    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::hex)以及在谷歌上搜索一些东西。我也试过:

    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
    
    7 回复  |  直到 16 年前
        1
  •  31
  •   anon anon    16 年前
    #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;
    }
    
        2
  •  7
  •   McDowell rahul gupta    16 年前
    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 .

        3
  •  2
  •   Loki Astari    16 年前

    尝试:

    #include <iomanip>
    ....
    stream << std::hex << static_cast<int>(buf[i]);
    
        4
  •  1
  •   Sebastian Wölk Mnebuerquo    5 年前

    char buffer[4];//room for 2 hex digits, one extra ' ' and \0
    sprintf(buffer,"%02X ",onebyte);
    
        5
  •  0
  •   Jason Plank Maksim Kondratyuk    13 年前

    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';
    }
    
        6
  •  0
  •   Alatey    11 年前

    字符到wchar_t(unicode)十六进制字符串

    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;
    }
    
        7
  •  -1
  •   Edouard A.    16 年前

    您只需配置流一次:

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