【问题标题】:Copy a Binary file 32 bytes per 32 bytes每 32 个字节复制一个二进制文件 32 个字节
【发布时间】:2015-06-18 09:23:19
【问题描述】:

我在这里尝试做的是每 32 个字节复制一个 32 个字节的二进制文件。 我为什么要这样做?因为我需要在我的主板的 USART 上发送这个二进制文件。我不能一次性发送,所以我每 32 个字节发送 32 个字节。

首先,我尝试将我的二进制文件读入缓冲区,然后将其写入另一个文件,每 32 个字节 3 个字节。 问题是,当我尝试执行我制作的新二进制文件时..它没有在板上执行,我不明白为什么

如果你想尝试一下,这是我的代码..

int sendBuff(char *buffer,int *size)
{
    int i,n =0;
    char c ;
    FILE *file,target;

    //Open file
    file = fopen("Nucleo-L152RE_bis.bin", "rb");

    if (!file)
    {
        fprintf(stderr, "Unable to open file %s", "Nucleo-L152RE_bis.hex");
        return 0;
    }
    *size = getFileSize(file);


    if (!buffer) {
        fprintf(stderr, "Memory error!");
        fclose(file);
        return 0;
    }

    //Read file contents into buffer
    fread(buffer,*size, 1, file);



    fclose(file);


    return 0;
}
void writefile(unsigned char *buffer,int size){

    FILE *file;
    int i;
    file = fopen("salut.bin", "a");
    if (!file)
    {
        fprintf(stderr, "Unable to open file %s", "Nucleo-L152RE.bin");

    }
    else
    {
        fwrite(buffer,sizeof(unsigned char),size,file);
        fclose(file);
    }
}

主要功能:

int main()
{
    /* variables locales */
    unsigned char bufferS[1000000];
    int nId = 5, nChoice, nBytesWritten, nBytesRead;
    int* pByteRead, pByteWritten;
    int size;
    int k = 0,k_hexa = 0;

    /* demande du numéro du port COM */



    /* boucle tant que l'on ne quitte pas */
    do
    {
        /* menu */


            //ecriture de l'executable dans un buffer
            sendBuff(bufferS, &size);
            printf("size of file: %d\n\n", size);
            k = 0;


            printf("SIZE : %d\n", size);

            //send program

            do
            {

                 printf("Envoi de donnees...\r\n");

                //WriteCOM(bufferS + k, 32, &nBytesWritten);
                writefile(bufferS+k,32);
                printf("%d octet(s) envoye(s) et k : %d .\r\n",
                        nBytesWritten, k);



                k += 32;

                // scanf("%d",&nChoice);
            } while (k < size);

       }
}

【问题讨论】:

  • 在 Windows 上吗?如果是,你不应该在 fopen 中使用“ab”而不是“a”吗?
  • 还有其他一些可能或可能不相关的缺陷:您确定文件大小是 32 的倍数吗?不应该动态分配bufferS吗? (顺便说一句,你当然可以在没有缓冲区的情况下工作)
  • 顺便说一句,您通常应该使用比 32 字节大得多的缓冲区。使用 8192 字节的缓冲区应该更明智!
  • 我发现你将函数命名为 sendBuff 而实际上它是读取的有点令人困惑。您还应该检查 fread 的返回值,以确保您确实获得了预期的字节数 (bytesRead = fread(buffer,1,*size,fp))
  • 一般来说,你应该检查运行时函数的返回值,尤其是关于 I/O

标签: c bin


【解决方案1】:

1)根据您的实施, 您在新的 salut.bin 中添加了额外的 (32-size%32) 冗余字节, 导致执行失败。这样复制就OK了,

           do
           {
                printf("Envoi de donnees...\r\n");

                //WriteCOM(bufferS + k, 32, &nBytesWritten);
                writefile(bufferS+k,32);
                printf("%d octet(s) envoye(s) et k : %d .\r\n",
                        nBytesWritten, k);
                k += 32;

                // scanf("%d",&nChoice);
            } while (k < size-32);
            writefile(bufferS+k, size%32);

2)错误的bin格式或内容会导致execute failure,有时是由于丢失某些字节或在文件末尾偶然添加了冗余字节造成的。

【讨论】:

  • @kidz55 如果可行,请点击绿色复选标记。
  • @Tilman Hausherr,谢谢。我再次编辑以添加回循环的缺失部分。
【解决方案2】:

我们应该照原样引用您发布的代码吗?在这种情况下,您似乎正在触发未定义的行为,因为您尝试在printf 中读取nBytesWritten 的值。但是nBytesWritten似乎没有初始化。

【讨论】:

  • 我不这么认为,"fopen("salut.bin", "a");"表示追加。
  • 您修改后的答案不再有用,因为这只适用于调试输出。
  • @TilmanHausherr:如果用户指的是这段代码,你是什么意思,有UB,所以任何事情都可能发生
  • 目前 nBytesWritten 的值只与 printf 相关。即使这个小缺陷被修复,他的真正问题仍然存在。
  • @TilmanHausherr:请阅读en.wikipedia.org/wiki/Undefined_behavior
猜你喜欢
  • 2015-12-11
  • 2019-03-14
  • 2013-08-21
  • 2010-11-05
  • 2023-03-26
  • 2015-08-31
  • 2011-08-30
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多