如何從8位字節轉換爲7位字節(基地256基地128)如何從8位字節轉換爲7位字節(基地256基地128)
我希望做像這樣:
public string BytesToString(byte[] in)
{
}
public byte[] StringToBytes(string in)
{
}
我知道base64是可用的,但它擴大了字節數組太多。
如何從8位字節轉換爲7位字節(基地256基地128)如何從8位字節轉換爲7位字節(基地256基地128)
我希望做像這樣:
public string BytesToString(byte[] in)
{
}
public byte[] StringToBytes(string in)
{
}
我知道base64是可用的,但它擴大了字節數組太多。
Base64對每個字符編碼6位,產生一個字符串,只需很少的努力就可以可靠地進行傳輸(模塊注意URL)。
沒有7位字母表具有相同的屬性 - 很多,很多例如,如果給定控制字符,則系統會失敗。
您是否絕對確定您不需要通過任何此類系統(包括存儲)?它足夠節省額外的一小部分空間,足以證明有必要擔心某些事情是否會將「\ n」更改爲「\ r \ n」,反之亦然,或者刪除字符0?
(對於存儲例如,2100個字節= 2800個字符以base64或base128 2400個字符。沒有一個巨大的差異IMO)
我強烈敦促你,看你是否能找到額外的存儲空間 - 以後可能會節省很多麻煩。
喬恩,我正在尋找類似這樣的東西: http:// www。koders.com/java/fid45DBB362CAC753027494F4B0C53F36F1A45C3BF0.aspx?s=base64 我不知道如何將其轉換爲C#。 – 2009-06-11 14:50:53
是UTF-7你在找什麼?
不,基本上我需要將字節從0到255的範圍轉換爲ASCII,然後再轉回到字節數組。我想要比base64提供的A-Z0-9的範圍更多。目的是二進制序列化一個對象,將字節轉換爲Base128,然後在另一端,將字符串轉換回字節。 – 2009-06-11 14:55:23
我不知道你在做什麼的細節,但我很驚訝低端ascii控制字符(0-32,或0x00-0x20)對你來說可以,但非ascii(128- 255或0x80-0xff)不好。尤其是0,這經常被解釋爲一個字符串終止符。我會迴應上面所說的雙向飛行,並推薦base-64。它是一個非常廣泛使用的標準,它可以只用安全的ASCII字符表示二進制數據,並且我確信c#已經有內置的支持 – Kip 2009-06-11 20:00:37
此外,還有ASCIIEncoding類,它將UTF-8字符串轉換爲8位字節數組,丟棄無法用7位ASCII表示的字符。
除非我誤解了這個問題,否則OP不想丟失數據。 (它也將無效數據轉換爲「?」而不是丟棄它)。 – 2009-06-10 17:33:48
從您的問題(如目前的狀況)中確定您想要實現的目標有點困難。你正在嘗試執行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));
}
您將使用128個字符集? – 2009-06-10 17:20:56