1

无论如何有任何想法如何做到这一点?

假设我有

char x[] = "ABCD";

我想把它变成一个int,所以我会有

int y = 'ABCD';

我只能放置单个字符,例如int y = x[0];目的是找到十进制表示,但我想要“ABCD”的十进制表示而不仅仅是“A”。

最后我会sprintf(dest, "%.2u", value);用来获取字符的十进制表示。

编辑:

我不明白为什么,但是对于“ABCD”,此代码有效

//unrolled bit ops
const char* x = "ABCD";
uint32_t y = 0;
y |= (uint32_t(x[0]) << 24); //MSB
y |= (uint32_t(x[1]) << 16);
y |= (uint32_t(x[2]) <<  8);
y |= (uint32_t(x[3]) /*<< 0*/);

但是,如果我使用“(¸þ¶”),我不会得到相同的结果。

编辑2 **:

我已经尝试了你最后一次编辑 Sam,但它仍然不起作用。我得到的值是“4294967294”,而不是正确的值“683212470”。我也这样做了

int h1 = '(';
int h2 = '¸';
int h3 = 'þ';
int h4 = '¶';

输出:

40
-72
-2
-74

我搜索了完整的 ascii 表,发现“þ”的值为“254”。我想这与此有关...我也尝试过使用 usigned 但没有好的结果。

edit3:如果我替换const char *x = "(¸þ¶"int x[] = {40, 184, 254, 182};(每个字符的十进制表示,它可以工作。我可以理解哪里出了问题,但我不知道如何解决它。

4

2 回答 2

4

您需要确保该 char 数组的 int 对齐以进行正确的强制转换或对该 int 执行 memcpy。还要注意整数的字节顺序!此外,使用 uint32_t 等 C99 整数类型也将有助于使您的代码具有可移植性。

请参阅此问题以了解如何转换位: 严格混叠和对齐

编辑:

R. Martinho Fernandes 的意思可能是这样的(未经测试):

//unrolled bit ops
const char* x = "ABCD";
uint32_t y = 0;
y |= (uint32_t(uint8_t(x[0])) << 24); //MSB
y |= (uint32_t(uint8_t(x[1])) << 16);
y |= (uint32_t(uint8_t(x[2])) <<  8);
y |= (uint32_t(uint8_t(x[3])) /*<< 0*/);

上面的示例避免了任何字节顺序的特定代码

编辑2:

对于动态字符数组(如果必须转换少于 4 个字符,则假设前导零字符):

const char* x = "ABC";
size_t nChars = 3;

assert(0 < nChars && nChars <= sizeof(uint32_t));

uint32_t y = 0;

int shift = (nChars*8)-8;
for(size_t i = 0;i < nChars;++i)
{
    y |= (uint32_t(uint8_t(x[i])) << shift);
    shift -= 8;
}
于 2013-01-21T14:42:16.180 回答
-1

如果这是您想要的,我已经创建了一个示例程序。

包括所需的头文件(stdio.h、stdlib.h、math.h、string.h)

unsigned long convertToInt(char *x);

void main() {

char x[] = "ABCD";
unsigned long y = 0;

y = convertToInt(x);

printf("Numeric value = %lu\n", y);

}

unsigned long convertToInt(char *x) {

unsigned long num = 0, i, n;`
char hex_c;

for(i = 0; i< strlen(x); i++)  {

    hex_c = x[i];

    if (hex_c >= '0' && hex_c <= '9') {
    n = hex_c - '0';
    } else if (hex_c >= 'A' && hex_c <= 'F') {
    n =  10 + hex_c - 'A';
    } else if (hex_c >= 'a' && hex_c <= 'f') {
    n = 10 + hex_c - 'a';
    } else {
        printf("Wrong input");
    return 0;
    }

    num += n * (pow(16, (strlen(x) - i - 1)));
}

return num;

}
于 2013-01-21T15:38:47.853 回答