16 진수 문자열 (char [])을 int로 변환 하시겠습니까?
"0x1800785"와 같은 값을 포함하는 char []이 있지만 값을 제공하려는 함수에는 int가 필요합니다. 어떻게 이것을 int로 변환 할 수 있습니까? 주변을 수색했지만 답을 찾을 수 없습니다. 감사.
시도해 보셨습니까 strtol()
?
예:
const char *hexstring = "abcdef0";
int number = (int)strtol(hexstring, NULL, 16);
경우에 숫자의 문자열 표현은 시작 0x
접두사, 하나는 있어야 기지로 0을 사용한다 :
const char *hexstring = "0xabcdef0";
int number = (int)strtol(hexstring, NULL, 0);
(16과 같은 명시 적 기반을 지정하는 것도 가능하지만 중복성을 도입하는 것은 권장하지 않습니다.)
다음과 같은 것이 유용 할 수 있습니다.
char str[] = "0x1800785";
int num;
sscanf(str, "%x", &num);
printf("0x%x %i\n", num, num);
남자 sscanf 읽기
또는 자체 구현을 원할 경우이 빠른 함수를 예로 작성했습니다.
/**
* 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
uint8_t 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;
}
문자열이라고 가정하면 strtol은 어떻습니까?
아래 코드 블록을 시도해보십시오.
char *p = "0x820";
uint16_t intVal;
sscanf(p, "%x", &intVal);
printf("value x: %x - %d", intVal, intVal);
출력은 다음과 같습니다.
value x: 820 - 2080
그래서 잠시 검색하고 strtol이 상당히 느리다는 것을 알게 된 후, 저는 제 자신의 함수를 코딩했습니다. 문자의 대문자에서만 작동하지만 소문자 기능을 추가하는 것은 문제가되지 않습니다.
int hexToInt(PCHAR _hex, int offset = 0, int size = 6)
{
int _result = 0;
DWORD _resultPtr = reinterpret_cast<DWORD>(&_result);
for(int i=0;i<size;i+=2)
{
int _multiplierFirstValue = 0, _addonSecondValue = 0;
char _firstChar = _hex[offset + i];
if(_firstChar >= 0x30 && _firstChar <= 0x39)
_multiplierFirstValue = _firstChar - 0x30;
else if(_firstChar >= 0x41 && _firstChar <= 0x46)
_multiplierFirstValue = 10 + (_firstChar - 0x41);
char _secndChar = _hex[offset + i + 1];
if(_secndChar >= 0x30 && _secndChar <= 0x39)
_addonSecondValue = _secndChar - 0x30;
else if(_secndChar >= 0x41 && _secndChar <= 0x46)
_addonSecondValue = 10 + (_secndChar - 0x41);
*(BYTE *)(_resultPtr + (size / 2) - (i / 2) - 1) = (BYTE)(_multiplierFirstValue * 16 + _addonSecondValue);
}
return _result;
}
용법:
char *someHex = "#CCFF00FF";
int hexDevalue = hexToInt(someHex, 1, 8);
변환하려는 16 진수가 오프셋 1에서 시작하기 때문에 1이고 16 진수 길이이기 때문에 8입니다.
Speedtest (1.000.000 호출) :
strtol ~ 0.4400s
hexToInt ~ 0.1100s
빠르고 더러운 솔루션 :
// 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;
}
입력이 정확하고 유효성 검사가 포함되지 않았는지 확인해야합니다 (C라고 말할 수 있음). 다행스럽게도 매우 컴팩트합니다. 'A'에서 'F'로, 'a'에서 'f'로 작동합니다.
접근 방식은 ASCII 테이블에서 알파벳 문자의 위치에 의존합니다. 예를 들어 Wikipedia ( https://en.wikipedia.org/wiki/ASCII#/media/File:USASCII_code_chart.png ) 를 살펴 보겠습니다 . 간단히 말해서 숫자는 문자 아래에 있으므로 숫자 (0 ~ 9)는 0에 대한 코드를 빼면 쉽게 변환됩니다. 알파벳 문자 (A ~ F)는 마지막 3 비트 이외의 0으로 읽히고 (효과적으로 대문자 또는 소문자로 작동하도록 함) 1을 빼고 (비트 마스킹 후 알파벳이 위치 1에서 시작하기 때문에) 10을 더합니다 ( A에서 F는 16 진수 코드에서 10 번째에서 15 번째 값을 나타 내기 때문입니다. 마지막으로 인코딩 된 숫자의 하단 및 상단 니블을 형성하는 두 자리를 결합해야합니다.
여기에서는 동일한 접근 방식을 사용합니다 (사소한 변형 포함).
#include <stdio.h>
// takes a null-terminated string of hexa characters and tries to
// convert it to numbers
long ahex2num(unsigned char *in){
unsigned char *pin = in; // lets use pointer to loop through the string
long out = 0; // here we accumulate the result
while(*pin != 0){
out <<= 4; // we have one more input character, so
// we shift the accumulated interim-result one order up
out += (*pin < 'A') ? *pin & 0xF : (*pin & 0x7) + 9; // add the new nibble
pin++; // go ahead
}
return out;
}
// main function will test our conversion fn
int main(void) {
unsigned char str[] = "1800785"; // no 0x prefix, please
long num;
num = ahex2num(str); // call the function
printf("Input: %s\n",str); // print input string
printf("Output: %x\n",num); // print the converted number back as hexa
printf("Check: %ld = %ld \n",num,0x1800785); // check the numeric values matches
return 0;
}
I made a librairy to make Hexadecimal / Decimal conversion without the use of stdio.h
. Very simple to use :
unsigned hexdec (const char *hex, const int s_hex);
Before the first conversion intialize the array used for conversion with :
void init_hexdec ();
Here the link on github : https://github.com/kevmuret/libhex/
i have done a similar thing, think it might help u its actually working for me
int main(){ int co[8],i;char ch[8];printf("please enter the string:");scanf("%s",ch);for(i=0;i<=7;i++){if((ch[i]>='A')&&(ch[i]<='F')){co[i]=(unsigned int)ch[i]-'A'+10;}else if((ch[i]>='0')&&(ch[i]<='9')){co[i]=(unsigned int)ch[i]-'0'+0;}}
here i have only taken a string of 8 characters. if u want u can add similar logic for 'a' to 'f' to give their equivalent hex values,i haven't done that cause i didn't needed it.
Use strtol
if you have libc available like the top answer suggests. However if you like custom stuff or are on a microcontroller without libc or so, you may want a slightly optimized version without complex branching.
#include <inttypes.h>
/**
* xtou64
* Take a hex string and convert it to a 64bit number (max 16 hex digits).
* The string must only contain digits and valid hex characters.
*/
uint64_t xtou64(const char *str)
{
uint64_t res = 0;
char c;
while ((c = *str++)) {
char v = (c & 0xF) + (c >> 6) | ((c >> 3) & 0x8);
res = (res << 4) | (uint64_t) v;
}
return res;
}
The bit shifting magic boils down to: Just use the last 4 bits, but if it is an non digit, then also add 9.
Use xtoi ( stdlib.h ). The string has "0x" as first two indexes so trim val[0] and val[1] off by sending xtoi &val[2].
xtoi( &val[2] );
I know this is really old but I think the solutions looked too complicated. Try this in VB:
Public Function HexToInt(sHEX as String) as long
Dim iLen as Integer
Dim i as Integer
Dim SumValue as Long
Dim iVal as long
Dim AscVal as long
iLen = Len(sHEX)
For i = 1 to Len(sHEX)
AscVal = Asc(UCase(Mid$(sHEX, i, 1)))
If AscVal >= 48 And AscVal <= 57 Then
iVal = AscVal - 48
ElseIf AscVal >= 65 And AscVal <= 70 Then
iVal = AscVal - 55
End If
SumValue = SumValue + iVal * 16 ^ (iLen- i)
Next i
HexToInt = SumValue
End Function
참고URL : https://stackoverflow.com/questions/10156409/convert-hex-string-char-to-int
'Programing' 카테고리의 다른 글
Java의 "ClassCastException"설명 (0) | 2020.10.28 |
---|---|
FBSDKCoreKit / FBSDKCoreKit.h 찾을 수 없음 오류 (0) | 2020.10.28 |
Visual Studio 디버거에서 개체를 직렬화하는 방법 (0) | 2020.10.28 |
Android Studio Gradle 프로젝트 "데몬 프로세스를 시작할 수 없음 / VM 초기화" (0) | 2020.10.28 |
Ruby에서 <<로 해시에 키 / 값 쌍 추가 (0) | 2020.10.28 |