2014-10-06 381 views
0

我需要開發兩個函數來對字節進行組合和分離操作。將兩個字節轉換爲一個字節,反之亦然

public byte Combine(Byte a, Byte b) 
{ 
    // ... Operations ... 
} 

public byte[] Separate(Byte input) 
{ 
    // ... Operations ... 
} 

public static void Main(String[] args) 
{ 
    Byte a, b, c; 
    a = <SOME BYTE VALUE>; 
    b = <SOME OTHER BYTE VALUE>; 

    Console.Writeline("Before Operation"); 
    Console.Writeline("a = " + Convert.ToString(a, 2)); 
    Console.Writeline("b = " + Convert.ToString(b, 2)); 

    // Combine Function called... 
    c = Combine(a, b); 

    // Separate Function called... 
    byte[] d = Separate(c); 

    a = d[0]; 
    b = d[1]; 

    Console.Writeline("After Operation"); 
    Console.Writeline("a = " + Convert.ToString(a, 2)); 
    Console.Writeline("b = " + Convert.ToString(b, 2)); 

    Console.ReadKey(); 
} 

我已經試過像進行組合AND,OR,XOR,NAND,NOTLEFT以及這個右SHIFT操作來實現上述功能很多東西。

我只想知道是否有任何方法可以做到這一點,或者Wether寫這種類型的函數是完全可能的。

請給我寶貴的建議和意見...

+0

這是不可能的。請參閱鴿子的原理。 – user1937198 2014-10-06 11:21:13

+0

沒有可能將兩個字節存儲爲一個字節,以允許重現輸入。我看到在Int32中存儲兩個'Int16'數字的唯一方法 - 它可以通過一個小的kownledge來完成,如何存儲32位int並移位操作。 – 2014-10-06 11:21:25

+0

您正在將一組較大的值(2個字節)轉換爲較小的一組(1個字節)。您肯定會碰到衝突,因此無法可靠地將1個字節映射回原來的2個字節。 – juharr 2014-10-06 11:21:39

回答

1

就像你可以在評論中看到的,你不能在1字節內存儲2個字節。如果能夠實現它,你可能會成爲世界上最有天賦的人 - 每一個數據都可以被壓縮兩次!

相反,你可以存儲內部32位int兩個16位整數:

public static uint ToInt(ushort first, ushort second) 
{ 
    return (uint)(first << 16) | second; 
} 

public static ushort ExtractFirst(uint val) 
{ 
    return (ushort)((val >> 16) & ushort.MaxValue); 
} 

public static ushort ExtractSecond(uint val) 
{ 
    return (ushort)(val & ushort.MaxValue); 
} 

接下來,我們可以兩個字節存儲爲一個16位int

public static ushort ToShort(byte first, byte second) 
{ 
    return (ushort)((first << 8) | second); 
} 

public static byte ExtractFirst(ushort location) 
{ 
    return (byte)((location >> 8) & byte.MaxValue); 
} 

public static byte ExtractSecond(ushort location) 
{ 
    return (byte)(location & byte.MaxValue); 
} 
相關問題