C程序 - 检测到同步字节前打印新行

时间:2017-08-19 08:30:54

标签: c

我想请求一点帮助。

我从文件中写了我的小程序来复制字节,但是把它保存为文本。 这就是我现在所拥有的:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf ("Opening input.txt:\n");

    FILE *fi;
    fi = fopen("input.txt", "rb");

    FILE *fo;
    fo = fopen("log.txt", "w");

    if (fo == NULL)
    {
        printf("Error opening file!\n");
        exit(1);
    }

    int c;

    while((c=fgetc(fi))!=EOF)
    {
        printf("%02X", c & 0xFF);
        fprintf(fo, "%02X", c & 0xFF);
    }

    printf("\n\n--- End of file ---\n");
    fprintf(fo, "\n\n--- End of file ---\n");

    fclose(fi);
    fclose(fo);

    return 0;
}

看起来一切正常,但我只有一点 log.txt 格式的请求。

这是HEX格式的 input.txt 的一个示例:

  

00 83 70 22 00 30 ........ 88 8C FF FF

     

00 83 70 22 ........ 88 8C FF FF

     

00 83 70 22 00 ........ 88 8C FF FF

行具有可变长度。

它的印刷方式如下:

  

008370220030 ........ 888CFFFF00837022 ........ 888CFFFF0083702200 ........ 888CFFFF

     

---文件结束---

一切都很完美,但只有一个问题是我想在检测到“0083”时打印新行。像这样:

  

008370220030 ........ 888CFFFF

     

00837022 ........ 888CFFFF

     

0083702200 ........ 888CFFFF

     

---文件结束---

我对C语言没有太多经验,但这个小程序可以按我的意愿运行。当检测到同步字节时,只知道如何指定代码来打印新行。

非常感谢您的帮助!!!

修改!!! 所以最后一切都按我的意愿运作!谢谢大家!!!

2 个答案:

答案 0 :(得分:0)

声明:

uint16_t detect = 0xffff;

并在printf之后添加

detect <<= 8;
detect |= (unsigned)ch & 0xff;

id(detect == 0x0083) printf("\n");

答案 1 :(得分:0)

简约状态机:

  • 如果程序看到一个\0,它尚未打印它
  • 记得看过它。
  • 在下一个字符上,仍然需要打印\0,但是(可能)需要首先输出\n
  • 并且始终打印下一个字符。

[如果出现两个连续的\0个字符,程序将会失败,但可以通过额外的条件修复]

int ch,state;

for(state=0;;){
        ch = getc(fi);
        if (ch == EOF) break;
        switch (state) {
        case 0: if(ch == 0) { state++; continue;}
                break;
        case 1: if(ch == 0x83) fputc('\n', fo);
                fprintf(fo,"00");
                state = 0;
                break;
                }
        fprintf(fo, "02X",ch&0xff);
        }
if(state) fprintf(fo,"00");