C 奇怪的十六进制到十进制转换
有人以奇怪(错误)的格式向我传递数据。要分析它,我需要: 0x34=34 不是0x34=52(就像现实生活中那样) 所以,基本上就是撕下十六进制,假装它一直都是十进制的 有什么帮助吗 编辑:为了让它更容易,我需要这样的东西: int i=52被传递到一个返回int值34的函数中 int i=85表示int为55C 奇怪的十六进制到十进制转换,c,math,hex,decimal,C,Math,Hex,Decimal,有人以奇怪(错误)的格式向我传递数据。要分析它,我需要: 0x34=34 不是0x34=52(就像现实生活中那样) 所以,基本上就是撕下十六进制,假装它一直都是十进制的 有什么帮助吗 编辑:为了让它更容易,我需要这样的东西: int i=52被传递到一个返回int值34的函数中 int i=85表示int为55 双重编辑:有一些东西倒过来了。今晚我很挣扎哈哈。这就是你需要的吗 char * strip_hex_prefix( char *str) { if( str &&
双重编辑:有一些东西倒过来了。今晚我很挣扎哈哈。这就是你需要的吗
char * strip_hex_prefix( char *str)
{
if( str && ( strlen(str) > 2 ) && (strncmp(tolower(str),"0x",2) == 0) )
return str+2;
}
或者直接在代码中
if( str && ( strlen(str) > 2 ) && (strncmp(tolower(str),"0x",2) == 0) )
str += 2;
进一步转换成十进制
int hex_2_dec(char *str)
{
int len = strlen(str);
int base = 1;
int dec_val = 0;
for (int i=len-1; i>=0; i--)
{
if (str[i]>='0' && str[i]<='9')
{
dec_val += (str[i] - 48)*base;
base = base * 16;
}
else if (str[i]>='A' && str[i]<='F')
{
dec_val += (str[i] - 55)*base;
base = base*16;
}
}
return dec_val;
}
int十六进制2十二进制(char*str)
{
int len=strlen(str);
int base=1;
int dec_val=0;
对于(int i=len-1;i>=0;i--)
{
如果(str[i]>='0'&&str[i]='A'&&str[i]这就是你需要的吗
char * strip_hex_prefix( char *str)
{
if( str && ( strlen(str) > 2 ) && (strncmp(tolower(str),"0x",2) == 0) )
return str+2;
}
或者直接在代码中
if( str && ( strlen(str) > 2 ) && (strncmp(tolower(str),"0x",2) == 0) )
str += 2;
进一步转换成十进制
int hex_2_dec(char *str)
{
int len = strlen(str);
int base = 1;
int dec_val = 0;
for (int i=len-1; i>=0; i--)
{
if (str[i]>='0' && str[i]<='9')
{
dec_val += (str[i] - 48)*base;
base = base * 16;
}
else if (str[i]>='A' && str[i]<='F')
{
dec_val += (str[i] - 55)*base;
base = base*16;
}
}
return dec_val;
}
int十六进制2十二进制(char*str)
{
int len=strlen(str);
int base=1;
int dec_val=0;
对于(int i=len-1;i>=0;i--)
{
如果(str[i]>='0'&&str[i]='A'&&str[i],这里有一个可用于无符号int的解决方案:
unsigned int convert(unsigned int n)
{
unsigned int r;
unsigned int m;
r = 0;
m = 1;
while (n) {
r += m * (n & 0xf);
n >>= 4;
m *= 10;
}
return r;
}
这是反函数:
unsigned int iconvert(unsigned int n)
{
unsigned int r;
unsigned int s;
r = 0;
s = 0;
while (n) {
r += (n % 10) << s;
n /= 10;
s += 4;
}
return r;
}
unsigned int i转换(unsigned int n)
{
无符号整数r;
无符号整数s;
r=0;
s=0;
while(n){
r+=(n%10)下面是一个适用于无符号int的解决方案:
unsigned int convert(unsigned int n)
{
unsigned int r;
unsigned int m;
r = 0;
m = 1;
while (n) {
r += m * (n & 0xf);
n >>= 4;
m *= 10;
}
return r;
}
这是反函数:
unsigned int iconvert(unsigned int n)
{
unsigned int r;
unsigned int s;
r = 0;
s = 0;
while (n) {
r += (n % 10) << s;
n /= 10;
s += 4;
}
return r;
}
unsigned int i转换(unsigned int n)
{
无符号整数r;
无符号整数s;
r=0;
s=0;
while(n){
r+=(n%10)函数的字符串参数,或从文件中读取?您尝试了什么?可以使用适当的scanf()来完成
格式,例如“0x%d”
可以完成这项工作……只需删除前两个字符?它保存在可转换为int的字符*中。蓝牙低能量通信。很抱歉没有澄清。因此,基本上您获取的是BCD格式的数据,并尝试将其转换为正常的二进制整数。这并不奇怪,但实际上是这在过去很常用,在许多应用程序中仍然广泛使用。函数的字符串参数或从文件读取?您尝试过什么?可以使用适当的scanf()来完成
格式,例如“0x%d”
可以完成这项工作……只需删除前两个字符?它保存在可转换为int的字符*中。蓝牙低能量通信。很抱歉没有澄清。因此,基本上您获取的是BCD格式的数据,并尝试将其转换为正常的二进制整数。这并不奇怪,但实际上是lly这在过去很常用,但在许多应用程序中仍然广泛使用。可能就是这样。你能用我所做的编辑进行验证吗?我解释得不好。@user2985888convert(0x34)
,即convert(52)
产生了34
。这是你想要的吗?还是你想要这个的倒数?原始帖子暗示了这一点,但编辑暗示了倒数。我也可以添加倒数,给我一分钟。我又编辑了一次。这看起来是对的。谢谢你!好的,我添加了正数和倒数两个版本-你挑吧!我只是有一个crap night lol。我会接受的。我验证了它的工作原理。我的编辑很差。可能就是这样。你能用我所做的编辑进行验证吗?我解释得很差。@user2985888convert(0x34)
,即convert(52)
产生了34
。这是你想要的吗?还是你想要这个的倒数?原始帖子暗示了这一点,但编辑暗示了倒数。我也可以添加倒数,给我一分钟。我又编辑了一次。这看起来是对的。谢谢你!好的,我添加了正数和倒数两个版本-你挑吧!我只是有一个cra晚上笑。我会接受这个。我验证了它的工作。我的编辑只是差。