UTF8 BIG5 串流資料解析
private static void BIG5Each(IList<byte> list, Action<int, int> callback)
{
var i = 0;
while (i < list.Count)
{
var len =
Between(list[i], 0x81, 0xFE) &&
(
Between(list[i + 1], 0x40, 0x7E) ||
Between(list[i + 1], 0xA1, 0xFE)
) ? 2 : 1;
callback(i, len);
i += len;
}
}
private static void UTF8Each(IList<byte> list, Action<int, int> callback)
{
var i = 0;
while (i < list.Count)
{
if ((list[i] >> 7) == 0x00) { callback(i, 1); i += 1; continue; }
if ((list[i] >> 5) == 0x06) { callback(i, 2); i += 2; continue; }
if ((list[i] >> 4) == 0x0E) { callback(i, 3); i += 3; continue; }
if ((list[i] >> 3) == 0x1E) { callback(i, 4); i += 4; continue; }
if ((list[i] >> 2) == 0x3E) { callback(i, 5); i += 5; continue; }
if ((list[i] >> 1) == 0x7E) { callback(i, 6); i += 6; continue; }
callback(i, 1);
i++;
}
}
private static bool Between(byte value, byte min, byte max)
{
return value >= min && value <= max;
}