先 稍微 記 一下UTF-8。
大於 ASCII 碼 的 , 就會 由 上面 的 第一 位元 組 的 前 幾位 表示 該 unicode 字元 的 長度, 比如
110xxxxxx
前三位 的 二 進 位 表示 表示 告訴 我們 這 是 個 2BYTE 的 UNICODE 字元 ;1110xxxx
是 個的 二 進 位 表示 表示 告訴 我們 這 是 個 2BYTE 的 UNICODE 字元 ;是 個 的 的 UNICODE字元 , 依此 類推 ; xxx 的 位置 由 字元 編碼 數 的 二進製 表示 的 位 填入。 越 靠右 的 x 具有 越 少 的 特殊 意義。 只 用 最短 的 那個 足夠 表達 一個 字元 編碼 數 的 的多位 元 組 串。 注意 在 多位 元 組 串 中, 第 一個 位元 組 的 開頭 “1” 的 數目 就是 整個 串 中 位元 組 的 數目.
因此 要把 一堆 byte 組成UTF-8的 字串, 所以 目前 的 想法 是 先 判斷 抓到 的 byte 第 幾位 開始 是 0, 我 參考 了 這篇Obter um bit específico do byte, 利用Bitwise Left Shift Operator ( <<)跟Operador AND bit a bit (&)來 判斷。
private int GetZeroBit(byte b)
{
for (int i = 7; i >= 0; i--)
{
if ((b & (1 << i)) != 0) continue;
else return 8 - i;
}
return 0;
}
原理很簡單,1 << i
只有從右邊數來第i
個位置為1,又用然後&
Ir比,只有當所以b
的同樣位置也是1
才會得到verdadeiro.所以就能判斷第一個0從哪出現.
byte[] myBytes;
List<string> myString = new List<string>();
for (int i = 0; i < myBytes.Length; i++)
{
int zeroIndex = GetZeroDigit(myBytes[i]);
if (zeroIndex > 0)
{
if (zeroIndex > 1) zeroIndex--;
myString.Add(Encoding.UTF8.GetString(myBytes, i, zeroIndex));
i = i + zeroIndex - 1;
}
}
順便 補充 一下Diferença entre >>> e >>簡單 說 就是>>
會 保持 正負 號, 也 就是 第 一個 bit 的 值 不變, 其他 值 右移。 而>>>
則 是 全部 右移, 最 左邊 補 0。