#include <string>
int32_t GetGbkCount(const void* pData, size_t size = -1, std::string* pGbk = nullptr)
{
const uint8_t* pCpData = (const uint8_t*)pData;
std::string strOutGbk; // 输出字符编码
uint16_t gbkCode = 0; // GBK编码
int32_t nByteCount = 0; // 字节计数
int32_t nChCount = 0; // 字符计数
bool fResult = true; // 操作结果
while ((0 != *pCpData) && (0 != size))
{
uint8_t ch = *pCpData;
// ASCII编码 兼容
if (ch <= 0x7F)
{
gbkCode = ch;
nChCount++;
}
else
{
// 高字节范围: 0x81 - 0xFE
if (0 == nByteCount)
{
gbkCode = 0;
if (ch >= 0x81 && ch <= 0xFE)
{
gbkCode = ch;
nByteCount = 1;
}
else
{
fResult = false;
break;
}
}
else
{
// 低字节范围: 0x40 - 0xFE (不包括0x7F)
if (1 == nByteCount)
{
if (!(ch >= 0x40 && ch <= 0xFE) || 0x7F == ch)
{
fResult = false;
break;
}
}
gbkCode = gbkCode << 8;
gbkCode |= ch;
nByteCount--;
if (0 == nByteCount)
{
nChCount++;
}
}
}
if (0 == nByteCount)
{
if (gbkCode <= 0x7F)
{
strOutGbk.push_back((uint8_t)gbkCode);
}
else
{
strOutGbk.push_back(gbkCode >> 8);
strOutGbk.push_back(gbkCode & 0xFF);
}
}
pCpData++;
if (-1 != size)
{
size--;
}
}
if (!fResult)
{
return -1;
}
if (pGbk)
{
*pGbk = std::move(strOutGbk);
}
return nChCount;
}