【问题标题】:Bit Array to String and back to Bit Array位数组到字符串并返回位数组
【发布时间】:2013-01-18 04:51:37
【问题描述】:

可能重复Converting byte array to string and back again in C#

我正在使用霍夫曼编码对来自here的一些文本进行压缩和解压缩

其中的代码构建了一个霍夫曼树,用于编码和解码。 当我直接使用代码时一切正常

对于我的情况,我需要获取压缩内容,将其存储并在需要时解压缩。

编码器的输出和解码器的输入是BitArray

当我尝试将此BitArray 转换为String 并返回BitArray 并使用以下代码对其进行解码时,我得到了一个奇怪的答案。

Tree huffmanTree = new Tree();
huffmanTree.Build(input);

string input = Console.ReadLine();
BitArray encoded = huffmanTree.Encode(input);

// Print the bits
Console.Write("Encoded Bits: ");
foreach (bool bit in encoded)
{
    Console.Write((bit ? 1 : 0) + "");
}
Console.WriteLine();

// Convert the bit array to bytes
Byte[] e = new Byte[(encoded.Length / 8 + (encoded.Length % 8 == 0 ? 0 : 1))];
encoded.CopyTo(e, 0);

// Convert the bytes to string
string output = Encoding.UTF8.GetString(e);

// Convert string back to bytes
e = new Byte[d.Length];
e = Encoding.UTF8.GetBytes(d);

// Convert bytes back to bit array
BitArray todecode = new BitArray(e);

string decoded = huffmanTree.Decode(todecode);

Console.WriteLine("Decoded: " + decoded);

Console.ReadLine();

the tutorial 的原始代码输出为:

我的代码的输出是:

朋友们我哪里错了?帮助我,在此先感谢。

【问题讨论】:

  • 请记住,C# 字符串是 UTF-16。
  • 我用同样奇怪的答案尝试了 ASCII。我尝试了 Unicode (UTF-16),但给出了一半正确和一半垃圾的答案。喜欢WelcomeWelcomESTT
  • 问题是CopyTo 假定 LSB 优先,而世界上其他所有健全的 API 都使用 MSB 优先。因此10000000b 等于1 而不是128

标签: c# string bytearray bitarray huffman-code


【解决方案1】:

我很确定 Encoding 不会往返 - 也就是说,您不能将任意字节序列编码为字符串,然后使用相同的 Encoding 来取回字节并且 总是 期望他们是一样的。

如果您希望能够从原始字节到字符串并返回到相同的原始字节,则需要使用 base64 编码,例如

http://blogs.microsoft.co.il/blogs/mneiter/archive/2009/03/22/how-to-encoding-and-decoding-base64-strings-in-c.aspx

【讨论】:

  • 但是 base64 提供了输入的 4/3 而不是压缩它。我需要压缩而不是编码(SRC:wikipedia.org)
  • @GopikrishnaS 那么你需要使用byte[],而不是stringstring 用于字符数据,而不是二进制数据。
【解决方案2】:

您不能将任意字节填充到字符串中。这个概念只是未定义。使用编码进行转换。

string output = Encoding.UTF8.GetString(e);

e 此时只是二进制垃圾,它不是 UTF8 字符串。所以在它上面调用 UTF8 方法是没有意义的。

解决方案:不要在字符串之间进行转换和反向转换。这不是往返。你为什么首先这样做?如果您需要字符串,请使用可往返格式,如 base-64 或 base-85。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 2019-06-13
    • 2014-07-30
    • 2013-08-04
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多