每 32 字节复制一个二进制文件 32 字节

标签 c bin

我在这里尝试做的是每 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);

       }
}

最佳答案

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格式或内容会导致执行失败,有时这是由于偶然丢失了一些字节或在文件末尾添加了冗余字节造成的。

关于每 32 字节复制一个二进制文件 32 字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30911411/

相关文章:

java - 为什么我不能将 Integer.toBinaryString() 连接到 Java 中的另一个字符串?

C程序时间转换

C 结构体指针数组 vs 结构体指针 malloc

c++ - 将 int 转换为 float : how it is done

c# - 从 C# 的 zip 文件中读取二进制文件而不解压缩

npm - 如何使用全局安装的webpack?

C# 不支持 ulong 到 bin/oct/dec/hex 字符串 -> Convert.ToString(ulong, base)

c - C中的归并排序算法

c++ - 如何获取char数组的列数?

java - bin文件加载进度条