我有一个包含十六进制代码的文本文件
00000000 4f909390
00000002 5e456783
00000003 3fe52341
我需要使用my_file.txt中的上述十六进制值对嵌入式设备进行编程。 但是,当我读取上面的文件并打印它们时,我看到文本中的上述十六进制值完全不同,我知道txt数据被转换为十六进制格式。
void print_file( )
{
char source[1000000];
FILE *fp = fopen("my_file.txt, "r");
UINT32 size = ftell(fp); /* get the size */
if(fp != NULL)
{
while((symbol = getc(fp)) != EOF)
{
strcat(source, &symbol);
}
fclose(fp);
}
for ( UINT32 i = 0; i < size; i++ )
printf( "%02x", buffer[i] );
}
上面的代码显示了十六进制转换的文本格式并显示了我
3030303030303030203466393039333930a303030303030303
2203565343536373833a3030303030303033203366653532333431.
我在网上查看的文本到十六进制转换完好无损。
所需的打印输出
00000000 4f909390
00000002 5e456783
00000003 3fe52341
有权在文本中单独读取十六进制值而不是从ASCII转换为十六进制?提前感谢。
答案 0 :(得分:0)
我并不完全清楚你想要什么,但我想你正试图读取一个包含两列数字的文本文件,都是十六进制的。这表示一个32位字的数组,它将被写入外围设备的板载存储器。我猜第一列是一个地址,第二列是要写在该地址的值。我不知道你想要写什么来写入文件中没有列出的地址。
在内存中表示此文件的逻辑方法是使用两个元素结构的数组:
struct memory_word
{
uint32_t addr;
uint32_t value;
};
您可以使用strtoul
int
parse_line(struct memory_word *buf, const char *line,
const char *fname, size_t lineno)
{
const char *p;
char *endp;
unsigned long n;
errno = 0;
p = line;
n = strtoul(p, &endp, 16);
if (endp == p || !isspace(*endp) || errno || n > (unsigned long)UINT32_MAX) {
fprintf(stderr, "%s:%d: invalid address\n", fname, lineno);
return -1;
}
buf->addr = (uint32_t)n;
p = endp;
n = strtoul(p, &endp, 16);
if (endp == p || !isspace(*endp) || errno || n > (unsigned long)UINT32_MAX) {
fprintf(stderr, "%s:%d: invalid value\n", fname, lineno);
return -1;
}
buf->value = (uint32_t)n;
p = endp;
while (isspace(*p)) p++;
if (*p) {
fprintf(stderr, "%s:%d: junk after record\n", fname, lineno);
return -1;
}
return 0;
}
你可以通过循环调用整个文件来阅读:
struct memory_word *
read_memory_file (const char *fname)
{
struct memory_word *values = 0;
void *ovalues;
size_t nvalues = 0;
size_t avalues = 0;
char *linebuf = 0;
size_t linesz = 0;
FILE *fp = fopen(fname, "rt");
if (!fp) {
perror(fname);
return 0;
}
while (getline(&linebuf, &linesz, fp) > 0) {
nvalues++;
if (nvalues > avalues) {
avalues = (avalues == 0) ? 16 : avalues * 2;
ovalues = values;
values = reallocarray(values, avalues, sizeof(uint32_t));
if (!values) {
perror("realloc");
free(ovalues);
return 0;
}
}
if (parse_line(&values[nvalues-1], linebuf, fname, nvalues)) {
fclose(fp);
free(values);
return 0;
}
}
if (ferror(fp)) {
perror(fname);
fclose(fp);
free(values);
return 0;
}
fclose(fp);
return values;
}
(reallocarray
不是C标准的一部分,但应该是。您可以从链接中获取副本。)