精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>编码解码>>关于base64编码

主题:关于base64编码
发信人: mrcloud()
整理人: wenbobo(2002-12-06 22:50:00), 站内信件
【 在 skyice (浪子) 的大作中提到: 】
: 我的意思也是等他发表了放入精华区,可是又不好明说,呵呵

: 【 在 yangcs (老山羊) 的大作中提到: 】
: : 【 在 skyice (浪子) 的大作中提到: 】
:    .......

请教:base64编码怎么不能编码中文。  共3篇    讨论区: CLanguage[ C语言]
 
----------------------------------------------------------------------
----------
  作 者: hob (小李飞刀) 2000.05.08 转贴 打包 回复  
     在C中,发MAIL时需要进行base64编码,但为何在程序里编码英文都正确,
 

带有中文就不行呢,只给我编码最前面的英文,为什么? 
     请高手指点,多谢 

----------------------------------------------------------------------
----------
  作 者: mrcloud (ahao) 2000.05.08 修改 删除 转贴 打包 回复  
【 在 hob (小李飞刀) 的大作中提到: 】 

你把base64的代码贴出来吧. 

----------------------------------------------------------------------
----------
  作 者: netbird (火焰和海水) 2000.05.09 转贴 打包 回复  

一定是你的程序有问题啦。base64编码可以对任何二进制数据进行编码,当然包
 
括汉字啦。 

----------------------------------------------------------------------
----------
re:mrcloud(ahao)   base64编码代码,  共2篇    讨论区: CLanguage[ C语言


  作 者: hob (小李飞刀) 2000.05.08 转贴 打包 回复  
英文可以正确编码,但中文不行。 

unsigned char *base64_encode(const char *str,int length,int *ret_lengt
h) 
{
  static char base64_table[] = 
        { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 
'M', 
          'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 
'Z', 
          'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 
'm', 
          'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 
'z', 
          '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', 
'\0' 
        }; 
  static char base64_pad = '='; 
  const char *current = str; 
  int i = 0; 
  unsigned char *result = (unsigned char *)malloc(((length + 3 - lengt
h % 3) * 4 / 3 + 1) * sizeof(char)); 
  while (length > 2) { /* keep going until we have less than 24 bits *

    result[i++] = base64_table[current[0] >> 2]; 
    result[i++] = base64_table[((current[0] & 0x03) << 4) + (current[1
] >> 4)]; 
    result[i++] = base64_table[((current[1] & 0x0f) << 2) + (current[2
] >> 6)]; 
    result[i++] = base64_table[current[2] & 0x3f]; 
    current += 3; 
    length -= 3; /* we just handle 3 octets of data */ 
  } 
  /* now deal with the tail end of things */ 
  if (length != 0) { 
    result[i++] = base64_table[current[0] >> 2]; 
    if (length > 1) { 
      result[i++] = base64_table[((current[0] & 0x03 ) << 4) + (curren
t[1] >> 4)]; 
      result[i++] = base64_table[(current[1] & 0x0f) << 2];
result[i++] = base64_pad;
}
else {
result[i++] = base64_table[(current[0] & 0x03) << 4];
result[i++] = base64_pad;
result[i++] = base64_pad;
}
}
if(ret_length) {
*ret_length = i;
}
result[i] = '\0'; // printf("%s\n",result);
return result;
}

----------------------------------------------------------------------
----------
作 者: mrcloud (ahao) 2000.05.08 修改 删除 转贴 打包 回复

我看了编码没什么问题,可能是你程序其他部分的错误,
再说对于base64来说,处理英文和中文并没有本质区别啊?

----------------------------------------------------------------------
----------
re:mrcloud(ahao) 共2篇 讨论区: CLanguage[ C语言]

作 者: hob (小李飞刀) 2000.05.08 转贴 打包 回复
我开始也这样怀疑,但是后来我只取出了这段代码,用一个字符串来测试,


英文的就没问题,编码后的字符串长度也正确,可中文的就不行,只编码了最前


面的英文部分。
我想也是从编码角度来讲,中英文应该没什么区别呀,但这究竟是哪里的问


题呢?
我的环境是linux,gcc.

----------------------------------------------------------------------
----------
作 者: mrcloud (ahao) 2000.05.08 修改 删除 转贴 打包 回复

我试了,7英文返回4*3=12正确,5中文字返回4*4=16正确。
9英文5中文字,返回4*7=28也正确啊?

是不是你传入的length参数不对?

----------------------------------------------------------------------
----------
re:mrcloud(ahao) 共2篇 讨论区: CLanguage[ C语言]

作 者: hob (小李飞刀) 2000.05.09 转贴 打包 回复
(也许是我的错,因为这段代码不是我自己写的,我是参考了PHP的源代码,
但我用英文当时试了一下,应该是正确的)
我又试了一下,我传进一个英文字符串,发现传回的字符串长度和
子程序中的第三个指针参数所指的内容是相同的。
即:strlen(result)和*ret_length的值相等。
但是含中文的字符串的这两个值是不相等的,这是为什么呢?
我传进去的两个length值英文和中文都是正确的。返回的*ret_length也
是正确的。
26英文length=26,*ret_length=36,strlen(result)=36
26英文3中文length=32,*ret_length=44,strlen(result)=36
难道非要操作系统支持中文不成,没这道理啊。

----------------------------------------------------------------------
----------
作 者: mrcloud (ahao) 2000.05.09 修改 删除 转贴 打包 回复

看出来了,代码有问题, 有符号数和无符号数的>>不同,前者高位置1. 

所以改一下: 
unsigned const char *current = (unsigned const char*)str;  

另:ret_length本来就是用来返回l的,无须再用strlen求. 

----------------------------------------------------------------------
----------



--
...我是在黑夜里展翅飞翔的恐怖...

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: branch-1-f30.st]

[关闭][返回]