.NET 編碼的基礎知識

.NET 編碼的一些基本概念和分析

簡單的類型概念

  • Hex (16進位)
  • byte 位元組 範圍是:0~255,二進位下的範圍就是00000000~11111111,相當於1位元組。
  • byte[] 位元組數組
  • bit 比特,只有2種狀態:0,1

1 位元組 等於 8 比特1byte=8bit

在c#中。Byte即byte,他是一個struct結構體,

b1等於b2.

byte b = 1;
byte b1 = 0xf;//以0x開頭 即16進位的寫法
byte b2 = 15;
Assert.Equal(b1, b2);

錯誤的語法

byte b3 = b1 + b2;

正確的語法

byte b3 = (byte)(b1 + b2);
//或
int b4 = b1 + b2;

因為byte的相互運算太容易發生溢出,+ 加的重載 是int類型相加,所以結果是int類型

Encoding.UTF8.GetBytes

UTF8是統一的編碼方式,它是一種變長的編碼方式.它可以使用1~4個位元組表示一個符號,根據不同的符號而變化位元組長度

byte[] plaintext = Encoding.UTF8.GetBytes("0123456789");

能得到什麼樣的數據,48,49,50,51,52,53,54,55,56,57。為什麼?

搜ASCII碼,我們就知道 0的ASCII碼是 48

如果是字母呢。

byte[] plaintext = Encoding.UTF8.GetBytes("ABCDabcd");

能得到什麼樣的數據,65,66,67,68,97,98,99,100。為什麼?還是因為ASCII碼。UTF8當然是兼容ASCII碼。

因為一個ASCII碼,1個位元組就能表示256個狀態,所以英文字母,阿拉伯數字,標點符號都不在話,哪如果是中文呢。這裡我們就拿UTF8編碼來分析。

byte[]   plaintext = Encoding.UTF8.GetBytes("中國");

如下內容,長度為6,228,184,173 都是十進位。如果轉成16進位呢。e4,b8,ad,如果分不清十六進位,建議學一下,電腦系統基礎。當然,說明一下,a代表10e即代表14.即14*16+4=228.表示時不區分大小寫,即用大寫A,和小寫a都能表示10

十進位 十六進位
0 228 e4
1 184 b8
2 173 ad
3 229 e5
4 155 9b
5 189 bd

我們從網上搜下,可以發現 中國 的UTF-8編碼: E4B8AD E59BBD.說明通過Encoding.UTF8.GetBytes的結果肯定是對的。中文是用3或4個 Bytes存儲的。

1.byte[] 轉換hex(16進位字元串)

  1. Encoding.UTF8.GetBytes能得到數據的十進位的位元組數組。
  2. BitConverter.ToString支援將十進位的數據轉換成16進位,中間以-分隔,所以需要將中間的- Replace
public string ByteToHex(string str)
{
    byte[] bytes = Encoding.UTF8.GetBytes(str);
    string hex = BitConverter.ToString(bytes, 0).Replace("-", string.Empty);
    return hex;
}

hex得到 的數據就是 E4B8ADE59BBD

 string hex= ByteToHex("中國");

2.byte[] 轉換hex:StringBuilder方式

如下內容為什麼能將數據轉成16進位.

  1. Encoding.UTF8.GetBytes能得到數據的十進位的位元組數組。
  2. 利用c#中的 複合格式化特性 {0:X2}自動轉換成16進位。同樣內容支援Console.WriteLine等
public string ByteToHex2(string str)
{
    byte[] bytes = Encoding.UTF8.GetBytes(str);
    StringBuilder ret = new StringBuilder();
    foreach (byte b in bytes)
    {
        //{0:x2} 小寫
        ret.AppendFormat("{0:X2}", b);
    }
    return ret.ToString();
}

hex(16進位字元串)轉換 byte[]

  1. 一個循環將16進位轉換成10進位。
public byte[] HexToByte(string hex)
{
    byte[] inputByteArray = new byte[hex.Length / 2];
    for (var x = 0; x < inputByteArray.Length; x++)
    {
        var i = Convert.ToInt32(hex.Substring(x * 2, 2), 16);
        inputByteArray[x] = (byte)i;
    }
    return inputByteArray;
}

調用如下內容,bytes[]中的長度為6,數據是228,184,173、229,155,189。即上文中的中國的十進位byte數組

string hexChinese = "E4B8ADE59BBD";//中國的UTF8編碼。十六進位。
byte[] bytes = HexToByte(hexChinese);
string text = Encoding.UTF8.GetString(bytes);// `中國`