2009-10-01 267 views
0

是否有可能以二进制格式获取字符串,整数等?我的意思是,假设我有字符串:以二进制表示形式获取字符串,int等?

“你好”,我想它以二进制格式存储,所以假设“你好”是

二进制11110000110011001111111100000000(我知道这不,我刚刚输入某事很快)。

我可以将上面的二进制文件而不是作为一个字符串,但与位的实际格式。

除此之外,它实际上可以存储少于8位。我得到的是如果字母A是文本中使用的最频繁的字母,我可以使用1位来存储它与压缩有关的信息,而不是构建二叉树。

+0

一个字符串只是一个结尾有空终止符的字节流。它已经是二进制格式。尝试查找zlib进行压缩。 – 2009-10-01 21:07:56

回答

3

是否有可能以二进制格式获得字符串,整数, 等?

是的。有几种不同的方法可以做到这一点。一种常用的方法是将MemoryStream从字节数组中取出,然后在该内存流的顶部创建一个BinaryWriter,然后将ints,bools,chars,strings等等写入BinaryWriter。这将填充表示您写入的数据的字节。还有其他方法可以做到这一点。

我可以将上述二进制不是作为字符串存储,而是以实际格式存储在比特中。

当然,你可以存储一个字节数组。

它实际上可以存储少于8位。

否。C#中最小的存储单元是一个字节。但是,有些类会让您将一组字节视为一组数据。您应该阅读有关BitArray类。

+0

谢谢,我会查看你的建议。 – Xaisoft 2009-10-02 05:15:07

2

你会假设什么编码?

+0

这应该真的是一个评论 – 2009-10-01 21:06:51

+1

同意,没有代表但是;) – gn22 2009-10-01 21:07:41

+1

在那里,现在你做。 :P – 2009-10-01 21:30:03

1

你可以使用之类的东西:

Convert.ToBytes(1); 
ASCII.GetBytes("text"); 
Unicode.GetBytes("text"); 

一旦你的字节,你可以做所有的位摆弄你想要的。在我们可以给你更多有用的信息之前,你需要一种算法。

2

我正在逐渐是,如果字母 A是 使用文本最频繁的信,我可以用1位来存储它 至于压缩,而不是 建立二叉树。

您正在描述的算法被称为Huffman coding。与你的例子相关,如果数据中经常出现'A',那么该算法将简单地表示为'A'。如果'B'也频繁出现(但比A少),该算法通常会表示'B' “为01.然后,其余字符将00xxxxx ...等

在本质上,该算法对数据进行统计分析,并生成代码,会给你最压缩。

+1

我们不得不在大学里写“Huff”和“Puff”,带回回忆。 – 2009-10-01 21:32:08

+0

所以它实际上可以存储这种表示而不必构建二叉树。 – Xaisoft 2009-10-01 21:34:13

+0

存储表示不需要构建二叉树。但是,代码通常以*视觉形式*表示为二叉树,因为这样更容易阅读。 – 2009-10-01 21:36:56

0

字符串实际存储在二进制格式,都是字符串。

字符串和另一种数据类型之间的区别是,当你的程序显示字符串时,它检索二进制和示出了相应的(ASCII)字符。

如果你将数据存储在一个压缩的格式,你将需要分配每个字符超过1位。 哪个字符是mose频繁?

如果1代表'A',0代表什么意思? 所有其他字符?

2

您正在寻找的是类似于Huffman coding的东西,它用于表示较短的位模式下更常见的值。

如何存储位代码仍然限于整个字节。没有使用少于一个字节的数据类型。您存储可变宽度位值的方式是将它们首尾排列在一个字节数组中。这样你就有了一系列位值,但这也意味着你只能从头到尾读取流,没有像字节数组中的字节值那样的随机访问值。

+0

为什么downvote?如果你不说自己不喜欢什么,那是毫无意义的...... – Guffa 2009-10-01 21:23:37

相关问题