我对C编程的经验很少,并且在创建需要用C编写的小实用程序的过程中(由于目标上可用编译器的限制),该实用程序将读取包含HEX BYTE ASCII字符串的文本文件(以下示例,通常)文件太长),并保存包含字节字符的输出二进制文件。
输入的TEXT文件示例:*文本文件的行长始终为32个字符,但最后一行小于32个字符但可被2整除。
717585003C6A3578D1EE2FF5FE850654
D234E41D350F5CCDDCCD7F0D15131FDF
C56EFE36A16D0E1AAE520CE531D8B173
EF
样本输出二进制文件:
qu….<j5…Ñî/õþ….T.Ò4DÝ5õ\ÍÜÍ.....ß.Ånþ6.m..®R.å1.±s.ï
在HEX编辑器中看到的示例输出;我以粗体显示的差异
71758500 3C6A35 85 D1EE2FF5 FE850654 D234 44DD 35 F5 5CCD DCCD7F0D 15131FDF C56EFE36 16 6D0E1A AE520CE5 31 81 B173 EF
到目前为止,这是我的工作;
#include <stdio.h>
#define MAXLINE 100
int main() {
FILE *fr, *fw;
char str[MAXLINE];
char* iFile = "A0.txt";
char* oFile = "APU.bin";
int i, iNum;
char b2[2];
fr = fopen(iFile, "r");
fw = fopen(oFile, "wb");
while (fgets(str, MAXLINE, fr) != NULL)
{
printf("\n%s", str);
for(i=0; i< strlen(str);i+=2)
{
if (str[i] == '\n')
break;
b2[0] = str[i];
b2[1] = str[i+1];
iNum = (int) strtol(b2, NULL, 16);
printf("\n%s %c ", b2,iNum);
fputc((char) iNum,fw);
}
}
fclose(fr);
fclose(fw);
return 0;
}
可以看出,输出与输入的精度不是100%准确,某些字节由于某些原因未得到翻译,我尚未弄清楚。救命。
***最终代码:
#include <stdio.h>
#define MAXLINE 100
int main(int argc, char *argv[]) {
FILE *fr, *fw;
char str[MAXLINE];
char *iFile, *oFile;
int i, iNum;
char b2[3];
b2[2] = '\0';
if (argc != 3)
goto err1;
iFile = argv[1];
oFile = argv[2];
if ((fr = fopen( iFile, "r")) == NULL)
goto err1;
if ((fw = fopen( oFile, "wb")) == NULL)
goto err1;
while (fgets(str, MAXLINE, fr) != NULL)
{
for(i=0; i< strlen(str);i+=2)
{
if (str[i] == '\n')
break;
b2[0] = str[i];
b2[1] = str[i+1];
iNum = (int) strtol(b2, NULL, 16);
fputc((int) iNum,fw);
}
}
fclose(fr);
fclose(fw);
return 0;
err1:
printf("\nError Occured");
printf("\n\nUsage: prog textin outbin\n");
return -1;
}
好的代码!无论如何:
char b2[2];
...
b2[0] = str[i];
b2[1] = str[i+1];
iNum = (int) strtol(b2, ...)
strtol
需要一个零终止的字符串。b2
不是零终止的,代码就是无效的。做:
char b2[3];
b2[2] = '\0';
...
b2[0] = str[i];
b2[1] = str[i+1];
// b2[2] always be '\0'
iNum = (int) strtol(b2, ...); // ok
另外,您也可以选择一个更好的变量名b2
,例如tempstring
。编写描述性代码将帮助您减少错误。
fputc((char) iNum,fw);
不强制转换-fputc
输出一个未签名的字符作为一个字符int
。只是
fputc(iNum, fw);
您的代码错过了错误检查日志-fopen
错误,strtol
错误和带有偶数个字符的处理行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句