制作自定义字符串编码器.net

时间:2010-02-20 21:33:12

标签: .net text encoding base

我知道.net支持字节数组的base64编码。但我认为如果使用更多的字符,我可以节省更多的空间。我在某处读到Unicode支持数千个不同的字符,那么为什么不使用base1024编码?如果有可能,您可以就如何实施它提供一些指导。感谢

4 个答案:

答案 0 :(得分:12)

Base64的目的是:以符合6位/字符的格式存储/传输二进制数据,以规避某些协议所施加的限制。如果您没有这样的限制,base64不适合您。它从未设计用于节省空间。如果您需要节省空间并且可以自由使用任何东西,那么只需将数组存储为二进制数据即可。

答案 1 :(得分:3)

base64的要点是避免编码问题。实际上所有仍在运行的机器都同意ASCII字符集。虽然可能还有一些EBCDIC机器消耗千瓦。 ASCII仅编码96个明确的字符。 Base64使用64个,加上填充字符。 Base128已经太多了。

没有任何关于Unicode的明确说法,使用的常见编码是UTF7,UTF8,UTF16,UTF32,UCS-2以及它们的最终端和大端变种。 Base1024需要1024个明确的字符,对任何人来说都太过分了。请注意,它不能只是一个编码范围,Unicode图表中有很多洞,它们是随机分布的。

答案 2 :(得分:0)

正如其他人已经提到的那样,base64不会节省任何空间。它甚至会炸掉包含相同信息所需的字符数(请查看wikipedia以查看三个字节需要四个字符进行表示)。

如果你真的需要节省一些空间并想要压缩一个字节数组,你应该看一下LZMA algorithm。如果您需要在C,C ++,C#或Java中实现此算法,请查看7zip page

答案 3 :(得分:0)

取决于您使用的是2字节Unicode编码(UCS2)还是多字节(UTF-8)。由于base 64使用8位字节中的6位,因此Base 1024仅比base64稍微好一点甚至更浪费空间。转换为base64的原始二进制数据变大4/3。 (约1.333倍增长)

但是使用UCS-2(16位)Unicode字符的base1024将只使用16位中的10位,所以它 需要8/5的空间。使用UCS-2转换为base1024的原始二进制数据将增长到原始大小的1.6倍。这比更糟糕。

如果你使用了UTF-8 Unicode,并且小心地只使用具有1或2字节编码的unicode字符,那么你最多可以从2个字符中获得1920个唯一的代码点,这对于数据密度略有改善。 (UTF-8编码仅使用每个附加*位字节的6位来指示代码点,其他2位用于指示要跟随的字节数更多)

所以这没有用,你应该研究在将数据转换为base64之前压缩数据的可能性。