0
裏面我想獲得這樣的結果:從當前輸入將一個字符串作爲十六進制一個uint32_t的
static uint32_t const m_deadbeef = 0x4c414c41 ; //this hex is "LALA"
:
char data[]="LALA";
所以我需要把data
的unint32_t
所以它看起來像裏面第一行。 我該如何有效地做到這一點?
裏面我想獲得這樣的結果:從當前輸入將一個字符串作爲十六進制一個uint32_t的
static uint32_t const m_deadbeef = 0x4c414c41 ; //this hex is "LALA"
:
char data[]="LALA";
所以我需要把data
的unint32_t
所以它看起來像裏面第一行。 我該如何有效地做到這一點?
這是微不足道的,你只需要抓住的字符值,並結合他們:
uint32_t uint_from_string(const char *s)
{
uint32_t x = 0;
for (int i = 0; *s != '\0' && i < 4; ++i)
{
x <<= 8;
x |= (uint32_t) *s++;
}
return x;
}
如果你使用這個,像這樣:
const uint32_t m_deadbeef = uint_from_string("LALA");
,你會在那裏得到的價值0x4c414c41
。
另外,請注意這裏沒有「放入十六進制」,這個數字也是用十進制打印的(它是1279347777
)。數字不是十六進制的,只有打印出來時才表示。
#include <stdint.h>
#include <stdio.h>
union str32b
{
uint32_t hex;
char str[4];
str32b(const char* in, int big_end = 0)
{
if (big_end)
for (int i = 0; i < 4; ++i)
str[i] = in[i];
else
for (int i = 0; i < 4; ++i)
str[4 - i - 1] = in[i];
}
};
int main()
{
const char* input = "ABCD";
str32b l_end = str32b(input);
printf("Little endian:\t0x%x\n", l_end.hex);
str32b b_end = str32b(input, 1);
printf("Big endian:\t0x%x\n", b_end.hex);
return 0;
}
輸出:
Little-endian: 0x41424344
Big-endian: 0x44434241
,試圖調用編譯器說的方法時似乎很大,但由於某些原因:衝突類型uint_from_string的。不知道爲什麼,但它運行在一個小的ARM芯片上。 – Curnelious
@Curnelious你需要把這個函數放在'main'之前,或者試着把函數原型'uint32_t uint_from_string(const char * s)' –