2009-06-10 77 views

回答

5

Base64對每個字符編碼6位,產生一個字符串,只需很少的努力就可以可靠地進行傳輸(模塊注意URL)。

沒有7位字母表具有相同的屬性 - 很多,很多例如,如果給定控制字符,則系統會失敗。

您是否絕對確定您不需要通過任何此類系統(包括存儲)?它足夠節省額外的一小部分空間,足以證明有必要擔心某些事情是否會將「\ n」更改爲「\ r \ n」,反之亦然,或者刪除字符0?

(對於存儲例如,2100個字節= 2800個字符以base64或base128 2400個字符。沒有一個巨大的差異IMO)

我強烈敦促你,看你是否能找到額外的存儲空間 - 以後可能會節省很多麻煩。

+0

喬恩,我正在尋找類似這樣的東西: http:// www。koders.com/java/fid45DBB362CAC753027494F4B0C53F36F1A45C3BF0.aspx?s=base64 我不知道如何將其轉換爲C#。 – 2009-06-11 14:50:53

0

UTF-7你在找什麼?

+0

不,基本上我需要將字節從0到255的範圍轉換爲ASCII,然後再轉回到字節數組。我想要比base64提供的A-Z0-9的範圍更多。目的是二進制序列化一個對象,將字節轉換爲Base128,然後在另一端,將字符串轉換回字節。 – 2009-06-11 14:55:23

+0

我不知道你在做什麼的細節,但我很驚訝低端ascii控制字符(0-32,或0x00-0x20)對你來說可以,但非ascii(128- 255或0x80-0xff)不好。尤其是0,這經常被解釋爲一個字符串終止符。我會迴應上面所說的雙向飛行,並推薦base-64。它是一個非常廣泛使用的標準,它可以只用安全的ASCII字符表示二進制數據,並且我確信c#已經有內置的支持 – Kip 2009-06-11 20:00:37

0

此外,還有ASCIIEncoding類,它將UTF-8字符串轉換爲8位字節數組,丟棄無法用7位ASCII表示的字符。

+1

除非我誤解了這個問題,否則OP不想丟失數據。 (它也將無效數據轉換爲「?」而不是丟棄它)。 – 2009-06-10 17:33:48

0

從您的問題(如目前的狀況)中確定您想要實現的目標有點困難。你正在嘗試執行base-128編碼,還是試圖將表示7位數字的一系列(可能是十六進制)數字轉換爲等效的二進制8位數字?

我剛剛描述的編碼是ID3v2 tag format中用於編碼the size field in the header的編碼。

如果這就是你想要達到的目標,那麼下面的代碼可能會有所斬獲。它基於ID3規範中的'257'示例:

[Test] 
public void GetInt() 
{ 
    var bytes = new byte[] { 0, 0, 2, 1}; 

    var result = 0; 

    foreach (var b in bytes) 
    { 
     result <<= 7; 
     result = result + (b & 0x7f); 
    } 

    Assert.That(result, Is.EqualTo(257)); 
} 

[Test] 
public void SetInt() 
{ 
    var i = 257; 

    var bytes = new Stack<byte>(); 

    for (var j = 0 ; j < sizeof(int) ; j++) 
    { 
     var b = (byte)(i & 0x7f); 
     bytes.Push(b); 
     i >>= 7; 
    } 

    Assert.That(bytes.Pop(), Is.EqualTo(0)); 
    Assert.That(bytes.Pop(), Is.EqualTo(0)); 
    Assert.That(bytes.Pop(), Is.EqualTo(2)); 
    Assert.That(bytes.Pop(), Is.EqualTo(1)); 
}