.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
代表10
,e
即代表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進制字符串)
Encoding.UTF8.GetBytes
能得到數據的十進制的位元組數組。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進制.
Encoding.UTF8.GetBytes
能得到數據的十進制的位元組數組。- 利用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[]
- 一個循環將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);// `中國`