如何将二进制文件转换为字节?

时间:2016-10-30 08:25:25

标签: c unix ftp binaryfiles fread

我正在构建一个简单的ftp,它允许用户询问unix服务器的基本命令(例如:cd home/file/)并将文件上传到服务器并从服务器下载文件。我已经获得了在客户端和服务器之间工作和打印的基本命令,但复制非文本文件是一项挑战。

get函数的当前代码如下:

Cli6.c

    else if (strcmp(tokens[0], "get") == 0) {
        char *filecpy = convertfile("mtg.jpg");
        printf("%s .... %d\n", filecpy, strlen(filecpy));
    }

FTP.c

char *convertfile(const char *filename) {
    FILE *fileptr; 
    char *buffer;
    long filen;
    size_t result;
     
    fileptr = fopen(filename, "rb");
     
    fseek(fileptr, 0, SEEK_END);
    filen = ftell(fileptr);
    rewind(fileptr);
     
    printf("File size: %d\n", filen);
     
    buffer = (char *)malloc(filen + 1); // this is only allocating 8bytes
     
    fread(buffer,filen, 1,fileptr);
    printf("Buffer: %s\n", buffer);
    close(fileptr);
     
     
    /*
    char *c; 
    char *buffer;
    fileptr = fopen(filename, "rb");
    while (c != EOF) {
        fread(&c, (size_t)1, (size_t)1, fileptr);
        buffer[c]++;
        c = fgetc(fileptr);
        sprintf(buffer[strlen(buffer)], "%c", c);
    }
    close(fileptr);
    */         
     
    return buffer;
}
 
//convert bytes to file
void convertbytes(const char *buffer, const char *filename) {
    FILE *fileptr; 
    printf("%s .... %d\n", buffer, strlen(buffer));
    fileptr = fopen(filename, "wb");
    //for (int i = 0; i < sizeof(buffer); i++) {
    fwrite(buffer, 1, strlen(buffer), fileptr);
        //printf("%c :: %d\n", buffer[i], i);
    //}
     
    close(fileptr);
}

现在,我只是想正确地复制文件,所以还没有发送到服务器。使用此代码,我可以正常复制文本文件,但另一个文件(如包含6.0kb的.o文件)将以8个字节复制。我正在尝试将文件转换为字节(准备发送到某处),然后从字节构建文件。我接近这个错吗?我应该使用其他方法来做到这一点吗?构建简单FTP的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

这是因为你的缓冲区充满了二进制数据。 二进制数据可以包含空字符(\ 0或0x00),并且与strlen不兼容,因为strlen将停留在第一个空字符处。

你可以尝试这样的东西来返回文件的实际长度:

struct buffer {
    char  *buffer;
    size_t filelen;
}

struct buffer *convertfile(const char *filename)
{
     ...
}

struct buffer * filecpy = convertfile("mtg.jpg");
printf("%.*s .... %d\n",filecpy.filelen, filecpy.buffer, filecpy.filelen);