[英]Converting a string of chars into its decimal value then back to its character valus
unsigned long long int power(int base, unsigned int exponent)
{
if (exponent == 0)
return 1;
else
return base * power(base, exponent - 1);
}
我正在開發一個程序,需要輸入8個字符的字符串(例如“ I want 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*/
}
輸入“我想要t”后,我得到“十進制值= 5269342824372117620”,然后將十進制數發送到解壓縮函數。 因此,我需要將5269342824372117620轉換回“我想要t”。 我嘗試了一點操作,但沒有成功,將不勝感激。
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);
}
一個簡單的解決方案是將字符串中的字符視為包含所有可能值的較大基數的數字 。 例如, base64編碼可以將8個字符的字符串轉換為48位數字,但是您只能在源字符串中使用最多64個不同字符的子集。
要將任何8個字節的字符串轉換為數字,必須使用至少256的基數。
給定您的額外輸入, 在輸入“我想要t”后,我得到“十進制值= 5269342824372117620” ,並且由於5269342824372117620 == 0x492077616e742074
,您確實確實對字符使用了基數256,大端順序和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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.