C#的base64编码

Richardicy 2014-12-09 11:31:56
C#的base 64编码方法我在百度上查了下,是用如下方式
string value = System.Convert.ToBase64String(m_ArchiveData.ToArray(),
0,
m_ArchiveData.Count,
Base64FormattingOptions.None
);
问题是,我们项目里面的接口是需要把转码后的数据作为byte[]传进去
所以我又不得不把这个sStr转成byte[]
Byte[] bytes = System.Text.Encoding.UTF8.GetBytes(value);
这样的性能损失是比较大的,有没有什么函数可以直接把byte[]转成base64的byte[]的呢?

顺便想问下base64编码到底是干嘛用的,如果用socket传数据的话,直接传个二进制码流过去
不就完了嘛
...全文
467 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ownorg 2016-05-25
  • 打赏
  • 举报
回复
引用 19 楼 sp1234 的回复:
其实使用 ToBase64String 没有什么不好,也不慢。因为毕竟 base64 编码中的每一个字必须是“字符”,逃不了字符的。 当你得到了 base64编码的字符串结果,你往往需要跟其它信息合并在一起。例如给你得 .net 对象的 string 类型的属性赋值,给 json 的某个字符串类型的 token 赋值,等等,然后才能将整个对象进行传递。 往往你要学会要通讯的东西,不是“一个字节流”这么简单。
之前犹豫对象是直接序列化还是base64字节组成员传输,考虑到跨平台和传输数据量,现决定用base64了!谢谢!
Richardicy 2014-12-10
  • 打赏
  • 举报
回复
引用 7 楼 mjp1234airen4385 的回复:
lz的意思是先中间多加一层转化,降低了你的效率吗?
回楼上,是的
  • 打赏
  • 举报
回复
其实使用 ToBase64String 没有什么不好,也不慢。因为毕竟 base64 编码中的每一个字必须是“字符”,逃不了字符的。 当你得到了 base64编码的字符串结果,你往往需要跟其它信息合并在一起。例如给你得 .net 对象的 string 类型的属性赋值,给 json 的某个字符串类型的 token 赋值,等等,然后才能将整个对象进行传递。 往往你要学会要通讯的东西,不是“一个字节流”这么简单。
  • 打赏
  • 举报
回复
引用 楼主 Richardicy 的回复:
顺便想问下base64编码到底是干嘛用的,如果用socket传数据的话,直接传个二进制码流过去 不就完了嘛
在许多协议中,需要使用字符串来表示二进制数字流。例如在 json、xml中,使用字符串编码表示byte[] 比 byte[] 本身要短多了。 而base64编码显然比 hex 字符串编码形式(例如 1b2f463c 这种形式)要更短。因此更常用base64形式。 跟什么加密解密没有关系。
  • 打赏
  • 举报
回复
自定义的计算,你可以参考 http://188.93.174.57/#newwindow=1&q=%22ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789%2B%2F%22 你不需要得到 unicode 字符串,只需要 char[]/byte[] 形式的表示,就需要自己写一个。
江南小鱼 2014-12-10
  • 打赏
  • 举报
回复
引用 楼主 Richardicy 的回复:
C#的base 64编码方法我在百度上查了下,是用如下方式 string value = System.Convert.ToBase64String(m_ArchiveData.ToArray(), 0, m_ArchiveData.Count, Base64FormattingOptions.None ); 问题是,我们项目里面的接口是需要把转码后的数据作为byte[]传进去 所以我又不得不把这个sStr转成byte[] Byte[] bytes = System.Text.Encoding.UTF8.GetBytes(value); 这样的性能损失是比较大的,有没有什么函数可以直接把byte[]转成base64的byte[]的呢? 顺便想问下base64编码到底是干嘛用的,如果用socket传数据的话,直接传个二进制码流过去 不就完了嘛
Base64是一种编码方式,一般用来进行简单的“加密”。 socket传输数据,一般把数据按一定的格式进行序列化传输。
破碎的脸 2014-12-10
  • 打赏
  • 举报
回复
Base64其实是用作网络数据传输的,虽然在WebService这样的东西里可以传byte[],但是你要考虑其它的问题,比如Android调用WebService,就无法使用byte[],而只能传string。
  • 打赏
  • 举报
回复
base64编码异常简单,你为什么不自己写4、5行语句自己去生成你要的格式?
吹风的兔子 2014-12-10
  • 打赏
  • 举报
回复
Base64 是为了 简化 字节流变相传输。 比如:WebService,服务端方法 返回一个 byte[] 理论上,最后的 XML 应该是: <byte>12</byte> <byte>14</byte> <byte>02</byte> <byte>36</byte> <byte>85</byte> 但实际是,最后的 结果确实: <bytes> qwertyuioasnudy12t37812348912u47 </bytes> —— 用Base64 极大了 缩短了 需要传输 的 字节流。 ———————————————————————————————— 我们常说: 2进制: 01 16进制 : 12345679890ABCDEF Base64就是: 64进制; 进制越低,相同的数据,最后的结果 位数 越长 Base64 是将 A-Z,a-z,0-9 外加几个 特殊符号 组成(是能组成的 最大进制) ———————————————————————————————— 楼主 不服气了:汉字有 3000 个,那就是 3000 进制?!! —— 会更加简短。 我在 这里回答:楼主,你是对的 —— 但一个汉字 就有 2个字节(256*256),实际算下来,Base汉字 字符很短,但字节流却不短! ————————————————————————————————
吹风的兔子 2014-12-10
  • 打赏
  • 举报
回复
Base64 是为了 简化 字节流变相传输。 比如:WebService,服务端方法 返回一个 byte[] 按照 SOAP 协议标准,最后的 XML 应该是: <byte>12</byte> <byte>12</byte> <byte>12</byte> <byte>12</byte> <byte>12</byte>
枫0子K 2014-12-10
  • 打赏
  • 举报
回复
围观围观 Base64一般感觉就跟加密混淆扯上关系。 楼主逻辑是str -> byte[] ->base64-> str -> byte[] -> Socket传输.转了太多次码怕影响效率的意思? 曾经也遇到过很多场景像楼主这么纠结,后来自己总结出C#的一个使用口诀,要方便,用接口,要效率,自定义。哈哈哈,勿喷。 我的意思是,.net提供Base64转码就很方便了,但一旦不尽如人意,那就只能自己写一个base64的转码了。或者再看看大牛们有什么好技术提供。
於黾 2014-12-10
  • 打赏
  • 举报
回复
这是你们通信协议设计的问题了 如果设计的不合理,导致必须来回转,那你也只能来回转,还有什么办法 好比我用C#做个dll,非要返回datatable类型,这东西c++能调用才怪,就只能再做另一个dll去转了
a102470 2014-12-10
  • 打赏
  • 举报
回复
byte[] bytes = Encoding.Default.GetBytes("要转换的字符"); string str = Convert.ToBase64String(bytes); byte[] outputb = Convert.FromBase64String(str);
天堂的鸽子 2014-12-09
  • 打赏
  • 举报
回复
BASE64编码是一种用于混淆明码的编码方式,其算法是把原先的8位字节数组顺序分配到新的6位字节数组中,再在每个字节的高2位填充0来组成新的8位字节数组。在.NET中Convert类型可以支持相互间的转换。
於黾 2014-12-09
  • 打赏
  • 举报
回复
总之就是你要显示汉字,就不要用base64 你要使用socket,直接传byte[]好了 你需要把byte[]变成字符串存放,然后还要再转回byte[],这时就需要用到base64
於黾 2014-12-09
  • 打赏
  • 举报
回复
base64编码就是为了存2进制数据啊,它本身并不需要解析为有意义的字符串显示,所以跟UTF8,GB2312不一样,不会出现未定义的字符显示成?的情况 主要是为了将数据存入文本,或通过url传值,或http协议传字符串什么的时候使用的
Forty2 2014-12-09
  • 打赏
  • 举报
回复
byte[] bytes = System.Convert.FromBase64String(value);
xdashewan 2014-12-09
  • 打赏
  • 举报
回复
你多大个字符串,GetBytes都会有性能问题
mjp1234airen4385 2014-12-09
  • 打赏
  • 举报
回复
lz的意思是先中间多加一层转化,降低了你的效率吗?
Richardicy 2014-12-09
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
总之就是你要显示汉字,就不要用base64 你要使用socket,直接传byte[]好了 你需要把byte[]变成字符串存放,然后还要再转回byte[],这时就需要用到base64
没办法,我是在大型系统里面进行优化,这个玩意的通信接口在传数据的时候用的是命令行的方式,会把二进制数据的一些不可见字符给截断,所以必须要进行base 64编码。但是提供的接口又是很蛋疼的byte[],我们这里的系统比较大,尽可能不要动接口。

110,536

社区成员

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

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

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