将十六进制从 .txt 带到 C 中的 array/string
Bringing Hexadecimal from .txt to a array/string in C
我的问题是我有一个文本文件,其中包含十六进制的此信息并由此打印:
fprintf(todos,"ff ff %02x 07 03 24 %02x %02x %02x %02x %02x\n",id,posl,posh,vell,velh,soma) ;
所有变量都采用 'int' 格式并具有十进制值
这是结果的一个例子
0xff 0xff 0x01 0x07 0x03 0x24 0x0c 0x00 0x02 0x01 0x3e
我想把这个序列放到程序里面的array/string。
但是,当我尝试使用 'fgets' 或 'fgetc' 来选择每个单独的元素时,它根本不起作用,因为当我尝试打印它时,结果类似于
' '
发生这种情况是因为我正在考虑将十六进制数作为字符吗?还是有其他我看不到的原因?
这太像作业了,所以我不想做太多。
第一位:简化输入。这已从问题中删除,但了解这一点很重要。
posl = pos & 0xFF; // using masking to ignore the upper bytes
posh = (pos >> 8) & 0xFF; // using shifting to move the upper byte into
// the lower, and then masking
给定位置 42330 (0xA55A)
pos1 变为 A55A AND 00FF
或 005a
Pos2 变为 A55A right shift 8
或 00A5
(如果 int 由于符号扩展而为 16 位,则可能 FFA5
)。 00A5
然后像 pos1 一样被屏蔽。
无需 if 语句、模数或任何其他冗长的代码。
接下来,如果你要读写同一个文件,你必须注意文件句柄指向文件中的哪个位置,如果你想读取你刚写的行,你将必须fseek回到行首。如果没有一堆额外的簿记,这可能会很棘手。玩得开心!
假设您找到了要阅读的行,fscanf 将使恢复数据变得容易。
int count = fscanf(todos, "ff ff %x 07 03 24 %x %x %x %x %x\n",
&id, &posl, &posh, &vell, &velh, &soma);
简单的方法是克隆输出行并用适当的格式说明符替换变量。读取的每个值都需要去某个地方,因此您需要提供变量的地址。
在提供的示例中,我将 fscanf 的 return 值存储为计数。计数将设置为成功读取的请求变量的数量。如果 count 没有读取请求的变量数,在本例中为 6,则该行未成功解析。
将数据放回原处就是在正确的位置下注正确的字节,因此我们使用左移运算符来撤消我们之前使用右移所做的操作,然后在低位字节中进行掩码。
pos = posh<<8 | posl;
我的问题是我有一个文本文件,其中包含十六进制的此信息并由此打印:
fprintf(todos,"ff ff %02x 07 03 24 %02x %02x %02x %02x %02x\n",id,posl,posh,vell,velh,soma) ;
所有变量都采用 'int' 格式并具有十进制值
这是结果的一个例子
0xff 0xff 0x01 0x07 0x03 0x24 0x0c 0x00 0x02 0x01 0x3e
我想把这个序列放到程序里面的array/string。 但是,当我尝试使用 'fgets' 或 'fgetc' 来选择每个单独的元素时,它根本不起作用,因为当我尝试打印它时,结果类似于
' '
发生这种情况是因为我正在考虑将十六进制数作为字符吗?还是有其他我看不到的原因?
这太像作业了,所以我不想做太多。
第一位:简化输入。这已从问题中删除,但了解这一点很重要。
posl = pos & 0xFF; // using masking to ignore the upper bytes
posh = (pos >> 8) & 0xFF; // using shifting to move the upper byte into
// the lower, and then masking
给定位置 42330 (0xA55A)
pos1 变为 A55A AND 00FF
或 005a
Pos2 变为 A55A right shift 8
或 00A5
(如果 int 由于符号扩展而为 16 位,则可能 FFA5
)。 00A5
然后像 pos1 一样被屏蔽。
无需 if 语句、模数或任何其他冗长的代码。
接下来,如果你要读写同一个文件,你必须注意文件句柄指向文件中的哪个位置,如果你想读取你刚写的行,你将必须fseek回到行首。如果没有一堆额外的簿记,这可能会很棘手。玩得开心!
假设您找到了要阅读的行,fscanf 将使恢复数据变得容易。
int count = fscanf(todos, "ff ff %x 07 03 24 %x %x %x %x %x\n",
&id, &posl, &posh, &vell, &velh, &soma);
简单的方法是克隆输出行并用适当的格式说明符替换变量。读取的每个值都需要去某个地方,因此您需要提供变量的地址。
在提供的示例中,我将 fscanf 的 return 值存储为计数。计数将设置为成功读取的请求变量的数量。如果 count 没有读取请求的变量数,在本例中为 6,则该行未成功解析。
将数据放回原处就是在正确的位置下注正确的字节,因此我们使用左移运算符来撤消我们之前使用右移所做的操作,然后在低位字节中进行掩码。
pos = posh<<8 | posl;