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

How do you convert binary file to bytes?

我正在构建一个简单的 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 的正确方法是什么?

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

您可以尝试类似的方法 return 文件的实际长度:

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);