所以这就是我必须做的事情。我有一个.txt文件,其中包含132x72的大图。我需要做的是将它放入一个十六进制值的c数组。
我需要找到一种方法来抓取前8行的第一个字符并将它们水平放在一起,这样我就可以将它们转换为十六进制。然后我需要这样做9次。
示例:
00000
00000
11111
01010
10101
10101
01010
10101
我需要变成:
00101101
00110010
00101101
00110010
00101101
最好/最简单的方法是什么?老实说,我不知道从哪里开始。
答案 0 :(得分:2)
假设在.txt文件中,1和0是字符(如果它是二进制文件,则需要先将它们转换):只需将文件逐行读入数组即可。然后你可以用步幅打印数组,i。即首先打印字符0,8,16,24 ......然后是1,9,17 ......等等:
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
printf("%c", chars[i + j * ROWS]);
}
printf("\n");
}
类似的东西。
答案 1 :(得分:0)
这是一种有趣的格式。无论如何,请读取一行,然后将值适当地添加到数组中。这就是我的意思:
输入第1行:01101
将对应于某个数组:image[0][0] = 0, image[1][0] = 1 ...
最好使用std::vector
方法push_back()
进行此操作。
// If you know the image size already
unsigned char image[NUM_ROWS][NUM_COLS/8]; // 8 bits per byte
std::ifstream file("yourfile.txt", std::ifstream::in);
// Initialize the array to 0 with memset or similar
// Read the whole file
int rows = 0;
int cols = 0;
while(!file.eof) {
std::string line;
// Get line by line
std::getline(file, line);
// Parse each line (probably better in another function)
const char* str = line.c_str();
while(str[rows] != '\0') {
unsigned val = str[rows] - '0'; // Convert to int
unsigned shift = 8 - (rows % 8); // 8 bits per byte - this is tricky big-endian or little endian?
image[rows][cols/8] |= val << shift; // Convert to int val and pack it to proper position
rows++;
}
cols++;
rows = 0;
}
file.close();
代码未经测试,但应该让您大致了解如何正确读取数据。现在你有了一个格式正确的二维数组和你的值(这就是转换的目的)。从这里开始,您可以将这些值作为int
值并进行适当转换(基数为16的转换从二进制开始很简单 - 即每个字节有两个十六进制数字)