将一串字符转换为十进制值,然后返回其字符值

时间:2018-04-21 13:54:25

标签: c

unsigned long long int power(int base, unsigned int exponent)
{
    if (exponent == 0)
        return 1;
    else
        return base * power(base, exponent - 1);
}

我正在开发一个程序,我需要输入一个包含8个字符的字符串(例如"我想要t")然后将其转换为pack函数中的long long int。我的打包功能正常。

unsigned long long int pack(char unpack[])
{
    /*converting string to long long int here
      didn't post code because its large*/
}

我进入"我想要"我得到"十进制值= 5269342824372117620"然后我将小数发送到解包函数。所以我需要将5269342824372117620转换回"我想要"。我尝试了一些不成功的操作,任何帮助都会非常感激。

void unpack(long long int pack)
{
    long long int bin;
    char convert[100];

    for(int i = 63, j = 0, k = 0; i >= 0; i--,j++)
    {
        if((pack & (1 << i)) != 0)
            bin += power(2,j);

        if(j % 8 == 0)
        {
            convert[k] = (char)bin;
            bin = 0;
            k++;
            j = -1;
        }
    } 
   printf("String: %s\n", convert);
}

1 个答案:

答案 0 :(得分:1)

针对您的问题的一个简单解决方案是将字符串中的字符视为包含所有可能值的大型基础中的 digits 。例如, base64 编码可以将8个字符的字符串转换为48位数字,但是您只能在源字符串中使用最多64个不同字符的子集。

要将任何8字节字符串转换为数字,您必须使用至少256的基数。

鉴于你的额外输入,我输入&#34;我想要&#34;我得到&#34;十进制值= 5269342824372117620&#34; ,自5269342824372117620 == 0x492077616e742074以来,你确实对字符使用了256,big-endian顺序和ASCII编码。

以下是此方法的简单可移植pack函数:

unsigned long long pack(const char *s) {
    unsigned long long x = 0;
    int i;
    for (i = 0; i < 8; i++) {
        x = x * 256 + (unsigned char)s[i];
    }
    return x;
}

unpack函数很容易派生:按相反的顺序计算除法的余数:

char *unpack(char *dest, unsigned long long x) {
    /* dest is assumed to have a length of at least 9 */
    int i;
    for (i = 8; i-- > 0; ) {
        s[i] = x % 256;
        x = x / 256;
    }
    s[8] = '\0';  /* set the null terminator */
    return s;
}

对于可能更快但不太便携的解决方案,你可以使用它,但是你可以在小端系统上获得不同的转换,例如当前的Mac和PC:

#include <string.h>

unsigned long long pack(const char *s) {
    unsigned long long x;
    memcpy(&x, s, 8);
    return x;
}

char *unpack(char *s, unsigned long long x) {
    memcpy(s, &x, 8);
    s[8] = '\0';
    return s;
}