无论如何都知道如何做到这一点?
让我说我有
char x[] = "ABCD";
我想把它放到一个int中,所以我会有
int y = 'ABCD';
我只能放置个别字符,例如int y = x[0];
目的是找到十进制表示,但我想要“ABCD”的十进制表示而不仅仅是“A”。
最后,我将使用sprintf(dest, "%.2u", value);
来获取char的十进制表示。
编辑:
我不明白为什么,但对于“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*/);
然而,每个实例,如果我使用“(¸þ¶”我不会得到相同的结果。
EDIT2 **:
我已经尝试过你的最后一次编辑Sam,但它仍然无效。我得到的值是“4294967294”而不是“683212470”正确的值。 我也做了这个
int h1 = '(';
int h2 = '¸';
int h3 = 'þ';
int h4 = '¶';
输出:
40
-72
-2
-74
我用Google搜索了完整的ascii表,我发现对于“þ”,值为“254”。我想它与此有关...我也尝试过使用但没有好结果。
edit3:如果我用const char *x = "(¸þ¶"
替换int x[] = {40, 184, 254, 182};
(每个字符的十进制表示,它都有效。我可以理解出错的地方,但我不知道如何修复它。
答案 0 :(得分:4)
您需要确保该char数组的int对齐以进行正确的转换或对该int执行memcpy。 还要注意整数的字节序!此外,使用C99整数类型(如uint32_t)也有助于使代码可移植。
有关如何转换位的信息,请参阅此问题: strict aliasing and alignment
修改强>
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;
}
答案 1 :(得分:-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;
}