在C中高效地将十六进制字符串转换为整数?
在C语言中,将十六进制数字串转换成二进制在C中高效地将十六进制字符串转换为整数?,c,performance,hex,strtol,C,Performance,Hex,Strtol,在C语言中,将十六进制数字串转换成二进制无符号int或无符号long最有效的方法是什么 例如,如果我有0xFFFFFFFE,我想要一个int,它的base10值4294967294是您想要的或。另请参见尝试以下操作: #include <stdio.h> int main() { char s[] = "fffffffe"; int x; sscanf(s, "%x", &x); printf("%u\n", x); } #包括 int ma
无符号int
或无符号long
最有效的方法是什么
例如,如果我有0xFFFFFFFE
,我想要一个int
,它的base10值4294967294
是您想要的或。另请参见尝试以下操作:
#include <stdio.h>
int main()
{
char s[] = "fffffffe";
int x;
sscanf(s, "%x", &x);
printf("%u\n", x);
}
#包括
int main()
{
字符s[]=“FFFFFFF E”;
int x;
sscanf(s、%x、&x);
printf(“%u\n”,x);
}
@Eric
为什么有效的代码解决方案会被否决?当然,这很难看,可能不是最快的方式,但说“strtol”或“sscanf”更有教育意义。如果你自己尝试一下,你会了解到一些事情是如何发生的
我真的不认为你的解决方案应该被否决,但我想为什么会这样是因为它不太实际。投票的想法是“最佳”答案会浮到顶部,虽然你的答案可能更能说明引擎盖下发生了什么(或者它可能发生的方式),但它绝对不是在生产系统中解析十六进制数的最佳方式
再一次,从教育的角度来看,我不认为你的答案有任何错误,我当然不会(也没有)投票否决它。不要因为一些人不喜欢你的答案而气馁,停止发帖。这是常有的事
我怀疑我的回答是否能让你对自己被否决的感觉好一点,但我知道,当你问为什么某些东西被否决,并且
我实际上希望看到一个C向导发布一些非常酷的东西,有点像我所做的,但不太冗长,同时仍然“手动”完成
好吧,我不是C大师,但我想到的是:
unsigned int parseHex(const char * str)
{
unsigned int val = 0;
char c;
while(c = *str++)
{
val <<= 4;
if (c >= '0' && c <= '9')
{
val += c & 0x0F;
continue;
}
c &= 0xDF;
if (c >= 'A' && c <= 'F')
{
val += (c & 0x07) + 9;
continue;
}
errno = EINVAL;
return 0;
}
return val;
}
unsigned int-parseHex(const-char*str)
{
无符号int val=0;
字符c;
而(c=*str++)
{
val用于较大的十六进制字符串,如我需要使用的示例中所示
为什么代码解决方案有效
被否决了?当然,很难看
也许是因为它不仅丑陋,而且没有教育意义,也不起作用。此外,我怀疑像我一样,大多数人目前没有编辑的权力(从所需的排名来看,永远不会)
使用数组有助于提高效率,但这段代码中没有提到。
它也不考虑大小写,因此对问题中提供的示例不起作用。如果没有stdlib,则必须手动执行
unsigned long hex2int(char *a, unsigned int len)
{
int i;
unsigned long val = 0;
for(i=0;i<len;i++)
if(a[i] <= 57)
val += (a[i]-48)*(1<<(4*(len-1-i)));
else
val += (a[i]-55)*(1<<(4*(len-1-i)));
return val;
}
unsigned long hex2int(char*a,unsigned int len)
{
int i;
无符号长val=0;
对于(i=0;i这目前只适用于小写,但非常容易使其同时适用于两者
cout << "\nEnter a hexadecimal number: ";
cin >> hexNumber;
orighex = hexNumber;
strlength = hexNumber.length();
for (i=0;i<strlength;i++)
{
hexa = hexNumber.substr(i,1);
if ((hexa>="0") && (hexa<="9"))
{
//cout << "This is a numerical value.\n";
}
else
{
//cout << "This is a alpabetical value.\n";
if (hexa=="a"){hexa="10";}
else if (hexa=="b"){hexa="11";}
else if (hexa=="c"){hexa="12";}
else if (hexa=="d"){hexa="13";}
else if (hexa=="e"){hexa="14";}
else if (hexa=="f"){hexa="15";}
else{cout << "INVALID ENTRY! ANSWER WONT BE CORRECT\n";}
}
//convert from string to integer
hx = atoi(hexa.c_str());
finalhex = finalhex + (hx*pow(16.0,strlength-i-1));
}
cout << "The hexadecimal number: " << orighex << " is " << finalhex << " in decimal.\n";
cout>hexNumber;
orighex=十六进制数;
strlength=hexNumber.length();
对于经常发生的(i=0;i=“0”)&&(hexa而言,您的问题存在严重的术语错误/歧义。在普通演讲中,这通常并不重要,但在这个特定问题的上下文中,它至关重要
你看,没有“十六进制值”和“十进位值”(或“十六进制数”和“十进位数”)之类的东西。“十六进制”和“十进位”是表示值的属性。同时,值(或数字)本身没有表示,所以它们不能是“十六进制”或“十进位”例如,C语法中的0xF
和15
是同一数字的两种不同表示形式
我猜您的问题,按照它的表述方式,表明您需要将值(即字符串)的ASCII十六进制表示形式转换为值(另一个字符串)的ASCII十进制表示形式。一种方法是使用整数表示法作为中间表示法:首先,将ASCII十六进制表示法转换为足够大的整数(使用strto…
组中的函数,如strtol
),然后将整数转换为ASCII十进制表示法(使用sprintf
)
如果这不是你需要做的,那么你必须澄清你的问题,因为从你的问题的表达方式是不可能弄清楚的。试着把这个从十进制转换成十六进制
#include<stdio.h>
#include<conio.h>
int main(void)
{
int count=0,digit,n,i=0;
int hex[5];
clrscr();
printf("enter a number ");
scanf("%d",&n);
if(n<10)
{
printf("%d",n);
}
switch(n)
{
case 10:
printf("A");
break;
case 11:
printf("B");
break;
case 12:
printf("B");
break;
case 13:
printf("C");
break;
case 14:
printf("D");
break;
case 15:
printf("E");
break;
case 16:
printf("F");
break;
default:;
}
while(n>16)
{
digit=n%16;
hex[i]=digit;
i++;
count++;
n=n/16;
}
hex[i]=n;
for(i=count;i>=0;i--)
{
switch(hex[i])
{
case 10:
printf("A");
break;
case 11:
printf("B");
break;
case 12:
printf("C");
break;
case 13:
printf("D");
break;
case 14:
printf("E");
break;
case 15:
printf("F");
break;
default:
printf("%d",hex[i]);
}
}
getch();
return 0;
}
#包括
#包括
内部主(空)
{
整数计数=0,数字,n,i=0;
int十六进制[5];
clrsc();
printf(“输入一个数字”);
scanf(“%d”和“&n”);
如果(n16)
{
数字=n%16;
十六进制[i]=数字;
i++;
计数++;
n=n/16;
}
十六进制[i]=n;
对于(i=count;i>=0;i--)
{
开关(十六进制[i])
{
案例10:
printf(“A”);
打破
案例11:
printf(“B”);
打破
案例12:
printf(“C”);
打破
案例13:
printf(“D”);
打破
案例14:
printf(“E”);
打破
案例15:
printf(“F”);
打破
违约:
printf(“%d”,十六进制[i]);
}
}
getch();
返回0;
}
十六进制到十进制。不要在联机编译器上运行它,因为它不起作用
#include<stdio.h>
void main()
{
unsigned int i;
scanf("%x",&i);
printf("%d",i);
}
#包括
void main()
{
无符号整数i;
scanf(“%x”、&i);
printf(“%d”,i);
}
<>代码>编辑:<强>现在兼容MSVC、C++和非GNU编译器(见结束).< /强>
问题是“最有效的方法”。OP没有指定平台,他可能正在编译一个基于RISC的ATMEL芯片,其代码有256字节的闪存
为了记录在案,为了那些(像我一样)欣赏“最简单的方法”和“最有效的方法”之间的区别,为了那些喜欢学习的人
static const long hextable[] = {
[0 ... 255] = -1, // bit aligned access into this table is considerably
['0'] = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, // faster for most modern processors,
['A'] = 10, 11, 12, 13, 14, 15, // for the space conscious, reduce to
['a'] = 10, 11, 12, 13, 14, 15 // signed char.
};
/**
* @brief convert a hexidecimal string to a signed long
* will not produce or process negative numbers except
* to signal error.
*
* @param hex without decoration, case insensitive.
*
* @return -1 on error, or result (max (sizeof(long)*8)-1 bits)
*/
long hexdec(unsigned const char *hex) {
long ret = 0;
while (*hex && ret >= 0) {
ret = (ret << 4) | hextable[*hex++];
}
return ret;
}
#包括“math.h”
#包括“stdio.h”
///////////////////////////////////////////////////////////////
//
static const long hextable[] = {
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1, 0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1,-1,10,11,12,13,14,15,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
};
#include "math.h"
#include "stdio.h"
///////////////////////////////////////////////////////////////
// The bits arg represents the bit say:8,16,32...
/////////////////////////////////////////////////////////////
volatile long Hex_To_Int(long Hex,char bits)
{
long Hex_2_Int;
char byte;
Hex_2_Int=0;
for(byte=0;byte<bits;byte++)
{
if(Hex&(0x0001<<byte))
Hex_2_Int+=1*(pow(2,byte));
else
Hex_2_Int+=0*(pow(2,byte));
}
return Hex_2_Int;
}
///////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////
void main (void)
{
int Dec;
char Hex=0xFA;
Dec= Hex_To_Int(Hex,8); //convert an 8-bis hexadecimal value to a number in base 10
printf("the number is %d",Dec);
}
/**
* hex2int
* take a hex string and convert it to a 32bit number (max 8 hex digits)
*/
uint32_t hex2int(char *hex) {
uint32_t val = 0;
while (*hex) {
// get current character then increment
char byte = *hex++;
// transform hex character to the 4bit equivalent number, using the ascii table indexes
if (byte >= '0' && byte <= '9') byte = byte - '0';
else if (byte >= 'a' && byte <='f') byte = byte - 'a' + 10;
else if (byte >= 'A' && byte <='F') byte = byte - 'A' + 10;
// shift 4 to make space for new digit, and add the 4 bits of the new digit
val = (val << 4) | (byte & 0xF);
}
return val;
}
char *z ="82ABC1EF";
uint32_t x = hex2int(z);
printf("Number is [%X]\n", x);
#include <stdio.h>
int main(){
unsigned char Hexadecimal = 0x6D; //example hex number
int Decimal = 0; //decimal number initialized to 0
Decimal = (int) Hexadecimal; //conversion
printf("The decimal number is %d\n", Decimal); //output
return 0;
}
// makes a number from two ascii hexa characters
int ahex2int(char a, char b){
a = (a <= '9') ? a - '0' : (a & 0x7) + 9;
b = (b <= '9') ? b - '0' : (b & 0x7) + 9;
return (a << 4) + b;
}