2011-10-19 37 views
1

我設計了一個自定義文件格式/網絡消息以儘可能減小大小,但我不知道如何實現它。任何擡頭都會有所幫助。從非八位字節創建數據類型位

前2個字節對​​應於2個數字,範圍從0到63,所以我使用6位。在餘下的4位,我存儲另一個號碼,從0到15

因此,例如,如果我有數字,和,比特將如下所示:

 
34---|25----|15-- 
10001001 10011111 

我看了BitArrayBitConverter,但我發現功能可以在8位,16位和32位類型上工作,而不是自定義的。

當然,完整的格式要長得多,但如果我明白這一點,我想我可以繼續。

任何人有一些建議,或可以給我一個提示開始呢?

謝謝!

+1

僅僅因爲我感興趣 - 最新的應用程序?什麼樣的緩衝區大小(你看到了什麼樣的節約)? –

+0

你有什麼意思?在這個例子中,你仍然在電線上發送16位數據;無論你說「這是8 + 8位」還是「這是6 + 6 + 4位」,它有什麼用處?我錯過了什麼嗎? – Piskvor

+0

在你的例子中,發送的第一個數字實際上是35. – dlev

回答

2

恐怕你必須自己編寫你的位操作代碼。在你的榜樣,代碼將是這個樣子:

int a = 34; 
int b = 25; 
int c = 15; 

byte[] data = new byte[2]; 

// Store to byte array 
data[0] = (byte)((a << 2) + (b >> 4)); 
data[1] = (byte)((b << 4) + c); 

// Read from byte array 
a = data[0] >> 2; 
b = ((data[0] & 3) << 4) + (data[1] >> 4); 
c = data[1] & 15; 

Console.WriteLine("a = " + a); // 34 
Console.WriteLine("b = " + b); // 25 
Console.WriteLine("c = " + c); // 15 

您可以使用的比特移位運算符(<<>>)和邏輯運算符位(|&)操縱位。

+0

現在這很有用!我想我應該手動創建所有訪問器,但好處是可以將所有訪問器移植到支持按位操作的所有語言上。 我用每個操作的顯示來補充你的答案:http://pastebin.com/dp9NvsqJ – Veehmot

+1

哦,很抱歉糾正你,但是'data [1]&31'將會是'data [1]&15 '。 – Veehmot

+0

@Veehmot - 你是對的,我確定了我的答案。 –

1

我查看BitArray和BitConverter,但我發現功能 工作在8位,16位和32位類型,而不是自定義的。

您將不得不編寫自己的函數。我只是建議一個結構。然後,您可以發送X字節,將這些字節讀入並解析到您的結構中,而不必擔心寫入自己的方法。

這是你通常會這樣做的。您可以定義結構的確切大小,它的工作原理與您想要的完全相同。

相關問題