[C#][.NET]16進位字串(Hex string)與2進位字串(Binary string)轉換

  • 14353
  • 0
  • .NET
  • 2016-01-31

昨晚解決16進位字串轉Byte[]可以用在運算用途,今晚來解決與2進位字串(Binary,和BCD很像但不是)間的轉換。

考慮轉換過程方便,我們都先將來源字串轉換為Byte[],再依照目的字串進位法需求轉出字串。(二進位)

  • Hex string -> Byte[] -> Binary String
  • Binary String -> Byte[] -> Hex String

 

就單一Byte來看,2進位是用8個0和1的值來表達字元的編碼方式,16進位則是用2個0-F的值表示。

為了節省傳輸空間並且加快處理速度,幾種金融業用的訊息交換都會在訊息Header處標示bitmap,用來表示訊息Body變動欄位中的switch on/off。

Bitmap string為16進位字串,因此每個字可以表示4個欄位on/off,Bitmap 第一個2: 0010 ,表示1.2.3.4欄中,只有第3個欄位有值。

好!那我們試著寫看看PaymentCardTool的線上功能:

1.首先是Hex string 轉Byte[],可以參考上一篇的16進位字串與Byte[]轉換

2.建立Byte[]轉 Binary string,這邊可以選用2種方法,

   A.逐一將Byte轉換為8 bit Array,再逐一判斷bit True/False,稍微有點麻煩,而且還需要注意bit由小到大順序的特性。

public static string BToBinary(this byte[] Bdata)
{
    //建立輸出字串
    StringBuilder sb = new StringBuilder();
    //建立BitArray
    BitArray bArray = new BitArray(Bdata);
    //依每8bit為單位展開
    for (int j = 0; j < bArray.Length / 8; j++)
    {
        for (int i = 8 - 1; i >= 0; i--)
        {
            if (bArray[i + (j * 8)])
            {
                sb.Append("1");
            }
            else
            {
                sb.Append("0");
            }
        }
    }
    return sb.ToString();
}

   B.逐一將Byte利用Convert.Tostring(,2)串接,簡單!

public static string BToBinary2(this byte[] Bdata)
{
    //建立輸出字串
    StringBuilder sb = new StringBuilder();
    //將每個Byte內容轉換為2進位字串後前補0
    for (int i = 0; i < Bdata.Length; i++)
    {
        sb.Append(Convert.ToString(Bdata[i], 2).PadLeft(8, '0'));
    }
    return sb.ToString();
}

3.然後將Binary String轉換為Byte[],這裡直接用Convert.ToByte串接

public static byte[] BinaryToByte(this string BinaryString)
{
    //運算後的位元組長度:2進位數字字串長/8
    byte[] byteOUT = new byte[BinaryString.Length / 8];
    for (int i = 0; i < BinaryString.Length; i = i + 8)
    {
        //每8位2進位數字轉換為一個Byte
        byteOUT[i / 8] = Convert.ToByte(BinaryString.Substring(i, 8), 2);
    }
    return byteOUT;
}

4.最後是Byte[]轉Hex string,也可以參考上一篇的16進位字串與Byte[]轉換

 

OK,程式撰寫完成了,我們先以16進位字串B2FF作為範例,參考Binary table:

B2FF = 1011 0010 1111 1111

測試程式碼內容

//16進位字串[B2]
string MyFirstFunction = "B2FF";
//16進位字串[B2]轉換為位元組陣列
byte[] myBytes = MyFirstFunction.HexToByte();

//轉換為2進位字串(方法1)Bitarray自行判讀及串接
Console.WriteLine("16進位字串{0}轉2進位字串{1}(Bitarray)", 
    MyFirstFunction, 
    myBytes.BToBinary());
Console.WriteLine("==========================");

//轉換為2進位字串(方法2)Convert.ToString(,2)串接
Console.WriteLine("16進位字串{0}轉2進位字串{1}(Convert.ToString(,2))", 
    MyFirstFunction, 
    myBytes.BToBinary2());
Console.WriteLine("==========================");

//轉回16進位字串
Console.WriteLine("2進位字串{0}轉16進位字串{1}",
    myBytes.BToBinary2(),
    myBytes.BToBinary2().BinaryToByte().BToHex());

查看一下測試結果: 成功!!!

也與PaymentCardTool相符!

 

小結:感覺.NET C#應該有出這種16進位字串轉2進位字串的方式,自己寫有點辛苦,但一時之間MSDN書架上找不到,應該被借走了,先列入TODO

 

參考:

Bitarray

Convert.ToString

Convert.ToByte