昨晚解決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
參考: