cui_boran 发表于 2020-9-17 14:48

【分享】C语言实现base64编解码图片

代码:
```
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>


const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

char * base64_encode( const unsigned char * bindata, char * base64, int binlength )
{
    int i, j;
    unsigned char current;

    for ( i = 0, j = 0 ; i < binlength ; i += 3 )
    {
      current = (bindata >> 2) ;
      current &= (unsigned char)0x3F;
      base64 = base64char[(int)current];

      current = ( (unsigned char)(bindata << 4 ) ) & ( (unsigned char)0x30 ) ;
      if ( i + 1 >= binlength )
      {
            base64 = base64char[(int)current];
            base64 = '=';
            base64 = '=';
            break;
      }
      current |= ( (unsigned char)(bindata >> 4) ) & ( (unsigned char) 0x0F );
      base64 = base64char[(int)current];

      current = ( (unsigned char)(bindata << 2) ) & ( (unsigned char)0x3C ) ;
      if ( i + 2 >= binlength )
      {
            base64 = base64char[(int)current];
            base64 = '=';
            break;
      }
      current |= ( (unsigned char)(bindata >> 6) ) & ( (unsigned char) 0x03 );
      base64 = base64char[(int)current];

      current = ( (unsigned char)bindata ) & ( (unsigned char)0x3F ) ;
      base64 = base64char[(int)current];
    }
    base64 = '\0';
    return base64;
}

int base64_decode( const char * base64, unsigned char * bindata )
{
    int i, j;
    unsigned char k;
    unsigned char temp;
    for ( i = 0, j = 0; base64 != '\0' ; i += 4 )
    {
      memset( temp, 0xFF, sizeof(temp) );
      for ( k = 0 ; k < 64 ; k ++ )
      {
            if ( base64char == base64 )
                temp= k;
      }
      for ( k = 0 ; k < 64 ; k ++ )
      {
            if ( base64char == base64 )
                temp= k;
      }
      for ( k = 0 ; k < 64 ; k ++ )
      {
            if ( base64char == base64 )
                temp= k;
      }
      for ( k = 0 ; k < 64 ; k ++ )
      {
            if ( base64char == base64 )
                temp= k;
      }

      bindata = ((unsigned char)(((unsigned char)(temp << 2))&0xFC)) |
                ((unsigned char)((unsigned char)(temp>>4)&0x03));
      if ( base64 == '=' )
            break;

      bindata = ((unsigned char)(((unsigned char)(temp << 4))&0xF0)) |
                ((unsigned char)((unsigned char)(temp>>2)&0x0F));
      if ( base64 == '=' )
            break;

      bindata = ((unsigned char)(((unsigned char)(temp << 6))&0xF0)) |
                ((unsigned char)(temp&0x3F));
    }
    return j;
}




int main()
{      

      //打开图片
      FILE *fp = NULL;
      unsigned int size;         //图片字节数
      char *buffer;
      char *buffer1;
      size_t result;
      char *ret1;
      unsigned int length;

      fp = fopen("tc2.jpg","rb");
      if (NULL == fp)
    {
            printf("open_error");
                exit(1);
    }


      //获取图片大小
      fseek(fp, 0L, SEEK_END);
      size = ftell(fp);
      fseek(fp, 0L, SEEK_SET);

      //分配内存存储整个图片
      buffer = (char *)malloc((size/4+1)*4);
      if (NULL == buffer)
    {
            printf("memory_error");
            exit(2);
    }

      //将图片拷贝到buffer
      result = fread(buffer, 1, size, fp);
         if (result != size)
    {
      printf("reading_error");
      exit (3);
    }
    fclose(fp);

      //base64编码
      buffer1 = (char *)malloc((size/4+1)*4);
      if (NULL == buffer1)
    {
            printf("memory_error");
            exit(2);
    }
    ret1 = base64_encode(buffer, buffer1, size);
    length = strlen(buffer1);
    printf("%s\n", buffer1);


      free(buffer);
      free(buffer1);
      return 0;
}
```
注:将程序中的tc2.jpg换成你需要编码的图片的路径就可以用了,也提供了解码函数可以调用。
最近在做图片上传,觉得这段base64编解码的代码很有用,分享给大家!
原帖地址:C语言对图片进行base64编码

wddtt 发表于 2020-9-17 14:58

谢谢楼主啊

6f7a8d 发表于 2020-9-17 15:33

厉害,学习了

yhgfwly007 发表于 2020-9-17 15:39

感谢分享,厉害了,楼主
页: [1]
查看完整版本: 【分享】C语言实现base64编解码图片