C 将字符串转换为十进制值,然后再转换回其字符值
我正在编写一个程序,需要输入一个8个字符的字符串,例如,我想在pack函数中将其转换为long int。我有包装功能工作良好C 将字符串转换为十进制值,然后再转换回其字符值,c,C,我正在编写一个程序,需要输入一个8个字符的字符串,例如,我想在pack函数中将其转换为long int。我有包装功能工作良好 unsigned long long int power(int base, unsigned int exponent) { if (exponent == 0) return 1; else return base * power(base, exponent - 1); } 输入后,我想得到Decimal=52693
unsigned long long int power(int base, unsigned int exponent)
{
if (exponent == 0)
return 1;
else
return base * power(base, exponent - 1);
}
输入后,我想得到Decimal=5269342824372117620中的值,然后将该小数发送到unpack函数。所以我需要把5269342824372117620转换回我想要的t。我尝试了位操纵,但没有成功。如果有任何帮助,我将不胜感激
unsigned long long int pack(char unpack[])
{
/*converting string to long long int here
didn't post code because its large*/
}
<> P>一个简单的解决问题的方法是考虑字符串中的字符在一个包含所有可能值的大基中是数字。例如,base64编码可以将8个字符的字符串转换为48位数字,但在源字符串中只能使用最多64个不同字符的子集 要将任何8字节字符串转换为数字,必须使用至少256的基数 对于您的额外输入,在我输入后,我希望得到十进制的值=5269342824372117620,并且由于5269342824372117620==0x492077616e742074,您确实使用了基256、大端顺序和ASCII编码来处理字符 以下是此方法的一个简单便携包功能:
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);
}
对于可能更快但便携性较差的解决方案,您可以使用此解决方案,但在little endian系统(如当前的Mac和PC)上会得到不同的转换:
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;
}
StackOverflow不是免费的编码服务。所以我希望你能。请更新您的问题,以显示您已在某个应用程序中尝试过的内容。有关更多信息,请参阅,并采用:答案取决于您编写包的方式。如果您使用位操作进行打包,只需使用这些操作的倒数来解包。
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;
}
#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;
}