base64编码问题,路过的看下对不,2进制转换

bobo_911 2009-12-17 10:46:28
下面是按照网上看的java的转过来的,不知道对不对,我现在要做的是

要把一个2进制流,转成base64编码的2进制byte,写过的给我个代码,网上找了下,都是2进制转字符串的!


public static byte[] base64Encode(byte[] byteData)
{
if (byteData == null)
return null;
int iSrcIdx; // index into source (byteData)
int iDestIdx; // index into destination (byteDest)
byte[] byteDest = new byte[((byteData.Length + 2) / 3) * 4]; //新的加密的2进制数组

for (iSrcIdx = 0, iDestIdx = 0; iSrcIdx < byteData.Length - 2; iSrcIdx += 3)
{
byteDest[iDestIdx++] = (byte)((byteData[iSrcIdx] >> 2) & 077);
byteDest[iDestIdx++] =
(byte)((byteData[iSrcIdx + 1] >> 4) & 017 | (byteData[iSrcIdx] << 4) & 077);
byteDest[iDestIdx++] =
(byte)((byteData[iSrcIdx + 2] >> 6)
& 003
| (byteData[iSrcIdx + 1] << 2)
& 077);
byteDest[iDestIdx++] = (byte)(byteData[iSrcIdx + 2] & 077);
}
if (iSrcIdx < byteData.Length)
{
byteDest[iDestIdx++] = (byte)((byteData[iSrcIdx] >> 2) & 077);
if (iSrcIdx < byteData.Length - 1)
{
byteDest[iDestIdx++] =
(byte)((byteData[iSrcIdx + 1] >> 4) & 017 | (byteData[iSrcIdx] << 4) & 077);
byteDest[iDestIdx++] = (byte)((byteData[iSrcIdx + 1] << 2) & 077);
}
else
byteDest[iDestIdx++] = (byte)((byteData[iSrcIdx] << 4) & 077);
}

for (iSrcIdx = 0; iSrcIdx < iDestIdx; iSrcIdx++)
{
if (byteDest[iSrcIdx] < 26)
byteDest[iSrcIdx] = (byte)(byteDest[iSrcIdx] + 'A');
else
if (byteDest[iSrcIdx] < 52)
byteDest[iSrcIdx] = (byte)(byteDest[iSrcIdx] + 'a' - 26);
else
if (byteDest[iSrcIdx] < 62)
byteDest[iSrcIdx] = (byte)(byteDest[iSrcIdx] + '0' - 52);
else
if (byteDest[iSrcIdx] < 63)
byteDest[iSrcIdx] = (byte)'+';
else
byteDest[iSrcIdx] = (byte)'/';
}
for (; iSrcIdx < byteDest.Length; iSrcIdx++)
byteDest[iSrcIdx] = (byte)'=';

return byteDest;


}
...全文
270 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
viena 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 linux7985 的回复:]
引用 21 楼 viena 的回复:
引用 19 楼 linux7985 的回复:
感觉,代码量好多喽,
下面贴一个我自己写的
……


晕倒,你说谁代码多啊?
转为字符串有现成的,一句可以解决的啊


呵呵,自己实现,加深对算法的了解
[/Quote]

汗,加深对算法的了解也没必要重复造轮子吧
对初学者锻炼编码能力也许有一定的帮助
但是了解这种算法似乎并无必要,到你真正需要时再去了解也不迟~
烈火蜓蜻 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 viena 的回复:]
引用 19 楼 linux7985 的回复:
感觉,代码量好多喽,
下面贴一个我自己写的
……


晕倒,你说谁代码多啊?
转为字符串有现成的,一句可以解决的啊
[/Quote]

呵呵,自己实现,加深对算法的了解
viena 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 bobo_911 的回复:]
谢谢了,原始那个那个压缩文件有问题,搞的出错了。今天问人要了个新的,可以了,谢谢啦!

特别感谢 (wien 维也纳)
[/Quote]
不客气
viena 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 linux7985 的回复:]
感觉,代码量好多喽,
下面贴一个我自己写的
……
[/Quote]

晕倒,你说谁代码多啊?
转为字符串有现成的,一句可以解决的啊
bobo_911 2009-12-18
  • 打赏
  • 举报
回复
谢谢了,原始那个那个压缩文件有问题,搞的出错了。今天问人要了个新的,可以了,谢谢啦!

特别感谢 (wien 维也纳)
烈火蜓蜻 2009-12-18
  • 打赏
  • 举报
回复
感觉,代码量好多喽,
下面贴一个我自己写的


public class Base64
{
/// <summary>
/// Base64密码表
/// </summary>
private const string CodeTable = "ABEFGHefgI6JL5MNX3K4YZabcdhiQRS89+TUVjklmnvwxyopqCDrstuz01OPW27^";
/// <summary>
/// 补位符号
/// </summary>
private const char CodeChar = '$';
/// <summary>
/// Base64加密函数
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public static string Base64EnCdoe( string code )
{
List<byte> bytes = new List<byte>( Encoding.Default.GetBytes( code ) );
int bytes_len = bytes.Count;
int Int_Length = bytes_len / 3 + ( bytes_len % 3 != 0 ? 1 : 0 );
bytes.Add( 0 );
bytes.Add( 0 );
StringBuilder values = new StringBuilder();
for ( int i = 0; i < Int_Length; i++ )
{
values.Append( CodeTable[( byte )( bytes[i * 3] & 0x3F )] );
values.Append( CodeTable[( byte )( ( bytes[i * 3 + 1] & 0x0F ) << 2 | ( bytes[i * 3] >> 6 & 0x03 ) )] );
values.Append( CodeTable[( byte )( bytes[i * 3 + 2] << 4 & 0x30 | bytes[i * 3 + 1] >> 4 & 0x0F )] );
values.Append( CodeTable[( byte )( bytes[i * 3 + 2] >> 2 & 0x3F )] );
}
return bytes_len % 3 == 1 ? values.ToString().Substring( 0, values.Length - 2 ) + CodeChar + CodeChar : bytes_len % 3 == 2 ? values.ToString().Substring( 0, values.Length - 1 ) + CodeChar : values.ToString();
}

/// <summary>
/// Base64解密函数
/// </summary>
/// <param name="Code"></param>
/// <returns></returns>
public static string Base64DnCdoe( string Code )
{
List<byte> bytes = new List<byte>(); // 待解码的数组
int Temp = 0, j = 0;
for ( int i = 0; i < Code.Length; i++ )
{// 把密码根据密码表翻译回6位有效位的Byte数组
Temp = CodeTable.IndexOf( Code[i] );
if ( Temp >= 0 ) bytes.Add( ( byte )Temp ); else bytes.Add( 0 );
}
byte[] tmps = new byte[( bytes.Count / 4 ) * 3]; // 创建明文 Byte 数组
if ( bytes.Count % 4 == 0 )
{
for ( int i = 0; i < bytes.Count; )
{// 把四个Byte元素的值,去除高二位,然后存入临时 Int 变量以便于每次8位的取出
Temp = bytes[i++] | bytes[i++] << 6 | bytes[i++] << 12 | bytes[i++] << 18;
tmps[j++] = ( byte )Temp; // 取低八位
tmps[j++] = ( byte )( Temp >> 8 ); // 取中八位
tmps[j++] = ( byte )( Temp >> 16 ); // 取高八位
}
// 如果找到CodeChar字符(也就是补位符号,一般是‘=’)是在倒数第二,则,丢弃最后两字符,如果是在倒数第一,则丢弃最后一个字符,如果没有找到,则完整返回
return Encoding.Default.GetString( tmps, 0, ( Code.IndexOf( CodeChar ) == Code.Length - 2 ? tmps.Length - 2 : Code.IndexOf( CodeChar ) == Code.Length - 1 ? tmps.Length - 1 : tmps.Length ) );
}
else // 不是4的倍数,该加密字符串有不合法
return "";
}
}
viena 2009-12-18
  • 打赏
  • 举报
回复
返回啥错误?
viena 2009-12-18
  • 打赏
  • 举报
回复
public static byte[] base64Encode(byte[] byteData)
{
return System.Text.Encoding.ASCII.GetBytes(Convert.ToBase64String(byteData));
}

vrhero 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 viena 的回复:]
貌似用默认编码转换也可以
C# codepublicstaticbyte[] base64Encode(byte[] byteData)
{return System.Text.Encoding.Default.GetBytes(Convert.ToBase64String);
}
[/Quote]
这个在英文、简繁体中文系统中是没问题的...因为GB2312和BIG5中英文编码还是ASCII,它们实际上是ASCII的扩展字符集...但是其他语言比如德文、法文、希腊文是不是这样就不清楚了,没研究过...
bobo_911 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 viena 的回复:]
C# codepublicstaticbyte[] base64Encode(byte[] byteData)
{return System.Text.Encoding.Default.GetBytes(Convert.ToBase64String(byteData));
}
[/Quote]
这个到是写过,但是有错,调用方法的时候返回错误。
viena 2009-12-18
  • 打赏
  • 举报
回复
public static byte[] base64Encode(byte[] byteData)
{
return System.Text.Encoding.Default.GetBytes(Convert.ToBase64String(byteData));
}
vrhero 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 viena 的回复:]
base64编码结果一定是可显示的ASCII字符
[/Quote]
没错...base64编码本来就是为电子邮件设计的,目的就是“设计为全部是可打印的ASCII码的形式”...只用到64个可打印的ASCII码,所以用ASCII编码绝对没问题...
viena 2009-12-18
  • 打赏
  • 举报
回复
貌似用默认编码转换也可以
public static byte[] base64Encode(byte[] byteData)
{
return System.Text.Encoding.Default.GetBytes(Convert.ToBase64String);
}
viena 2009-12-18
  • 打赏
  • 举报
回复
base64最初设计是为了Email,由于历史原因,Email只被允许传送ASCII字符~
viena 2009-12-18
  • 打赏
  • 举报
回复
特地去看了下base64编码规则,貌似有点复杂
按字节转换好以后,因为有些非可显示字符,还要用其特有的编码表转换下,最后用=来补空位
base64编码结果一定是可显示的ASCII字符

我觉得还是调用现成的简单些
可以如3楼所说用Convert.ToBase64CharArray先转为char数组
然后遍历把char转换为字节即可,因为所有的字符都是ASCII字符
所以这种转换是不会有问题的~
bobo_911 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bobo_911 的回复:]
引用 6 楼 viena 的回复:
问问题最好把详细需求说清楚,可以少走弯路~

接口函数
String createMMS(String gmcc_login_name, String pwd, String  mms_subject, byte []  mms_zip)

参数说明: 
gmcc_login_name:业务营销平台帐号,由业务营销系统分配给SP,不能空。
pwd: 密码,登陆密码,由业务营销平台分配给SP,不能空。
mms_subject:彩信主题(可以为空) 。
mms_zip:彩信包数据流,必须是先把彩信包压缩为 zip 格式,再将二进制流转换成Base64编码格式,并且彩信包解压后的大小不能超过100K,在zip压缩数据包内必须包含一个xml文件,文件名必须叫mms.smil。彩信包规范请参考附加说明。注意如果压缩包里有文本文件,其编码方式必须保存为ANSI编码的

[/Quote]
服务程序的内码为:GBK。
bobo_911 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 viena 的回复:]
问问题最好把详细需求说清楚,可以少走弯路~
[/Quote]
接口函数
String createMMS(String gmcc_login_name, String pwd, String mms_subject, byte [] mms_zip)

参数说明:
gmcc_login_name:业务营销平台帐号,由业务营销系统分配给SP,不能空。
pwd: 密码,登陆密码,由业务营销平台分配给SP,不能空。
mms_subject:彩信主题(可以为空) 。
mms_zip:彩信包数据流,必须是先把彩信包压缩为 zip 格式,再将二进制流转换成Base64编码格式,并且彩信包解压后的大小不能超过100K,在zip压缩数据包内必须包含一个xml文件,文件名必须叫mms.smil。彩信包规范请参考附加说明。注意如果压缩包里有文本文件,其编码方式必须保存为ANSI编码的
ludeli2004 2009-12-18
  • 打赏
  • 举报
回复
帮你顶一下
viena 2009-12-18
  • 打赏
  • 举报
回复
问问题最好把详细需求说清楚,可以少走弯路~
viena 2009-12-18
  • 打赏
  • 举报
回复
base64编码本身是字符串,Convert.ToBase64String就可以了
至于如何转为byte[],要看你用什么规则,换句话说按什么编码
都有现成的,一句搞定的~
加载更多回复(3)

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧