1. 程式人生 > >C++將無結束符字串(ASCII)轉為數字數值的快速方法(支援16進位制)

C++將無結束符字串(ASCII)轉為數字數值的快速方法(支援16進位制)

通常情況下的字串轉為數字,可以使用C的atoi,或者C++的sstream來轉換,但是這要求待轉換源字串要有\0結束符,如果只想轉換字串中一部分,或者轉換char*中不帶結束符的字串的時候,以上的方式均需要將字元拷貝出來並且給出結束符才能進行下一步轉換,有了拷貝的動作轉換的速度就慢了,以下的方法是根據ASCII字元對應數值的特點迴圈將字元轉換為數字數值的函式,並支援16進位制。

//************************************
// Method:    AsciiToByte 將ASCII字元轉換為數字
// Returns:   BYTE 返回的數字
// Parameter: BYTE b 待轉換的字元
//************************************
BYTE AsciiToByte(BYTE b)
{
	BYTE ret = 0;
	if(b >= '0' && b <= '9')
		ret = b - '0';
	else if(b >= 'A' && b <= 'F')
		ret = b - 'A' + 10;
	else if(b >= 'a' && b <= 'f')
		ret = b - 'a' + 10;
	else
		ret = 0;
	return ret;
}

//************************************
// Method:    ReadNumber 將指定長度字串轉換為數字
// Returns:   int 返回的數值
// Parameter: BYTE * str 待轉換的字串指標
// Parameter: int count 待轉換的字串長度
// Parameter: bool radix16 是否16進位制,預設false
//************************************
int ReadNumber(BYTE *str,int count, bool radix16 = false)
{
	int ret = 0;
	while(count-- > 0)
	{
		ret *= radix16 ? 16 : 10;
		ret += AsciiToByte(*str++);
	}
	return ret;
}

使用方法:
char *str = "12345ABCD";
int num10 = ReadNumber((BYTE*)str, 5);
int num16 = ReadNumber((BYTE*)str + 4,  5, true);
結果num10=12345,num16=371661