将文件的十六进制转储或原始数据提取为文本

3

我想知道是否有一种方法可以将文件的十六进制转储或原始数据输出到txt文件。 例如,我有一个文件,比如说“data.jpg”(文件类型不重要),如何将HEXdump(14ed 5602等)导出到文件“output.txt”? 还有,我如何指定输出的格式,例如Unicode或UTF? 在C++中实现

3个回答

2
也许是这样的吗?
#include <sstream>
#include <iostream>
#include <iomanip>
#include <iterator>
#include <algorithm>

int main()
{
    std::stringstream buffer( "testxzy" );
    std::istreambuf_iterator<char> it( buffer.rdbuf( ) );
    std::istreambuf_iterator<char> end; // eof

    std::cout << std::hex << std::showbase;

    std::copy(it, end, std::ostream_iterator<int>(std::cout));

    std::cout << std::endl;

    return 0;
}

您只需要用读取二进制文件的ifstream替换buffer,并使用ofstream而不是cout将输出写入文本文件。


+1 代码写得很好,你还可以在同一行中声明 "end" 并使用 "buffer" 构建它。 - nurettin

2
您可以使用循环、fread和fprintf:使用read获取字节的字节值,然后使用fprintf将十六进制打印到文件中,格式为%x
如果您希望速度更快,可以加载整个机器字(int或long long),而不是单个字节;如果您希望速度更快,可以先fread整个数组,然后sprintf整个数组,最后将该数组fprintf到文件中。
参考链接:

http://www.cplusplus.com/reference/clibrary/cstdio/fread/

http://www.cplusplus.com/reference/clibrary/cstdio/fprintf/


1

这是相当老的 - 如果你想要Unicode,你必须自己添加。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    unsigned long offset = 0;
    FILE *input;
    int bytes, i, j;
    unsigned char buffer[16];
    char outbuffer[60];

    if ( argc < 2 ) {
        fprintf(stderr, "\nUsage: dump filename [filename...]");
        return EXIT_FAILURE;
    }

    for (j=1;j<argc; ++j) {

        if ( NULL ==(input=fopen(argv[j], "rb")))
            continue;

        printf("\n%s:\n", argv[j]);

        while (0 < (bytes=fread(buffer, 1, 16, input))) {
            sprintf(outbuffer, "%8.8lx: ", offset+=16);
            for (i=0;i<bytes;i++) {
                sprintf(outbuffer+10+3*i, "%2.2X ",buffer[i]);
                if (!isprint(buffer[i]))
                    buffer[i] = '.';
            }
            printf("%-60s %*.*s\n", outbuffer, bytes, bytes, buffer);
        }
        fclose(input);
    }
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接