visual读取一个文件的十六进制数据,并将其存储到c++中的字符串2d数组中



我有"hex.txt";文件这是一些数据:

gdujdurkndvju;

dusigfluyfygrleuieubhfl;wieeufhrr

ygilfreuso'pgtgtgt['rgjhery48

我需要将其读取为十六进制,并将其存储为字符串2d数组(16列)。

示例:

67 64 75 6A 64 75 72 6B 6E 64 76 6A 75 3B 72 6F

61 65 6E 27 70 65 66 6B 27 6F 6A 66 73 62 66 77

68 0D 0A 64 75 73 69 66 6C 75 79 66 79 67 72

6C 65 75 69 65 75 62 68 66 6C 3B 77 69 65 65 75

66 68 72 72 0D 0A 79 67 69 6C 72 66 72 65 75 73

6F 76 27 72 70 67 74 67 74 67 5B 73 27 72 67

6A 68 65 72 79 34 38

这是我试过的代码。我需要帮助来完成这个代码。

unsigned char hx;
int main()
{
ifstream data("hex.txt", std::ios::binary);
data >> std::noskipws;
while (data >> hx) {
    std::cout << std::hex <<std::setw(2)<< std::setfill('0') << (int)hx<<" ";
}
return 0;
}

好的,现在使用std::string和std::stringstream 进行新的尝试

#include <iostream>
#include <stdio.h>
#include <fstream>
#include <iomanip>
#include <sstream>
#include <string>
int main(int argc, char** argv){
    std::ifstream data("hex.txt", std::ios::binary | std::ios::ate);    
    data >> std::noskipws;
    int filesize = data.tellg();
    data.seekg(0);
    // array of strings containing outputformated bytes
    std::string* filebytes = new std::string[filesize];
    char currentByte;   
    int rowWidth = 16;
    int idx = 0;
    while (idx < filesize && !data.eof()) {
        data.get(currentByte);
        // buffers strings to concatenate outputformat
        std::stringstream ss;
        ss << std::hex << std::setw(2)<< std::setfill('0') << (int)currentByte;
        // putting strings into the string array
        filebytes[idx] = ss.str();
        idx++;
    }
    data.close();
    //output to debug
    for(idx = 0; idx < filesize; idx++){
        std::cout << filebytes[idx] << " ";
        if(idx > 0 && idx % rowWidth == 0){
            std::cout << std::endl;
        }
    }
    return 0;
}

愿这就是你想要的。

我将字节写入一维数组以避免平方运行时。您可以使用我为输出所做的定义rowWith-lik将其解释为矩阵。

#include <iostream>
#include <stdio.h>
#include <fstream>
int main(int argc, char** argv){
    std::ifstream data("hex.txt", std::ios::binary | std::ios::ate);    
    data >> std::noskipws;
    int filesize = data.tellg(); //getting filesize in byte
    data.seekg(0); //setting the cursor back to the beginning of the file
    char* filebytes = new char[filesize];
    char currentByte;   
    int rowWidth = 16;
    int cCol = 0;
    while (!data.eof()) {
        data.get(currentByte);
        std::cout << std::hex << (int)currentByte << " ";
        filebytes[cCol] = currentByte;
        cCol++;
        if(cCol > 0 && cCol % rowWidth == 0){
            std::cout << std::endl;
        }
    }
    data.close();
    return 0;
}

我希望这就是你想要做的。

相关内容

  • 没有找到相关文章

最新更新