当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将ASCII中字符的十六进制值写入文本文件?》经验,为你挑选了2个好方法。

这是我目前所拥有的:

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),以及搜索一下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

小智.. 30

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

编辑:零填充:

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

这就是为什么我喜欢*C++流:cout << hex << setw(2)<< setfill('0')<< int(c)<< endl只是*so*比printf更清晰("% 02x",c);-)我知道它的类型安全(呃)但他们不能梦想一些不那么奇怪的东西吗? (4认同)

清晰度是一个观点问题......我不认为printf("%02x",c)可以被视为"清晰" (4认同)

如果c <0,您可能希望使用无符号(c)而不是int(c). (2认同)


McDowell.. 7

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

这里有更多代码.



1> 小智..:
#include 
using namespace std;
int main() {
    char c = 123;
    cout << hex << int(c) << endl;
}

编辑:零填充:

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


这就是为什么我喜欢*C++流:cout << hex << setw(2)<< setfill('0')<< int(c)<< endl只是*so*比printf更清晰("% 02x",c);-)我知道它的类型安全(呃)但他们不能梦想一些不那么奇怪的东西吗?
清晰度是一个观点问题......我不认为printf("%02x",c)可以被视为"清晰"
如果c <0,您可能希望使用无符号(c)而不是int(c).

2> McDowell..:
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 '?';
}

这里有更多代码.

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有