2009-10-01 63 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

相關問題