十六进制字符串 与十进制整数的转换 与 取模
思路:首先是将十六进制的字符串转换成整数
那么可以写出如下的函数:
//将十六进制数转换为十进制数字,可能会溢出
int converHexToInteger(const string& str){
int ans = 0;
int hexBase = 16;
for (int i=0; i<str.size(); ++i){
int t = convertHexCharToInt(str[i]);
ans = ans*hexBase + t;
}
return ans;
}
其中convertHexCharToInt()
将十六进制字符转换为十进制数字。
但是MD5字符串很长时,int可能会溢出。
因此,最好是得到对某个整数的模。
取模时,也可以按照转换的思想,逐个字符进行取模。
当进行到下一位时,把当前的数字乘以base即16加上个位,然后再进行取模。即:
//十六进制取模
int modHexStr(const string& str, int mod){
int ans = 0;
int hexBase = 16;
for (int i=0; i<str.size(); ++i){
int t = convertHexCharToInt(str[i]);
ans = (ans * 16 + t) % mod;
}
return ans;
}
总的代码及测试代码如下:
#include<iostream>
#include <string>
using namespace std;
//将十六进制字符转换为 十进制数字 f->15 a->10 8->8
int convertHexCharToInt(char c){
int t;
if(c>='a' && c<='f'){
t = c-'a' + 10;
}else if (c>='0'&&c<='9'){
t = c-'0';
}else{
t = 0;
}
return t;
}
//将十六进制数转换为十进制数字,可能会溢出
int converHexToInteger(const string& str){
int ans = 0;
int hexBase = 16;
for (int i=0; i<str.size(); ++i){
int t = convertHexCharToInt(str[i]);
ans = ans*hexBase + t;
}
return ans;
}
//十六进制取模
int modHexStr(const string& str, int mod){
int ans = 0;
int hexBase = 16;
for (int i=0; i<str.size(); ++i){
int t = convertHexCharToInt(str[i]);
ans = (ans * 16 + t) % mod;
}
return ans;
}
void main(){
string md5 = "eb87";
string md51 = "ff";
int mod = 7;
cout<<md5<<":"<<converHexToInteger(md5)<<endl; //eb87 = 60295
cout<<md51<<":"<<converHexToInteger(md51)<<endl; //ff = 255
cout<<md5<<"%"<<mod<<":"<<modHexStr(md5, mod)<<endl; //60295%7 = 4
cout<<md51<<"%"<<mod<<":"<<modHexStr(md51, mod)<<endl;//255%7 = 3
cout<<60295%7<<endl;
cout<<255%7<<endl;
system("pause");
return;
}