大家好我已经改进了我的代码.. 这段代码适用于任意数量的字符,但是当我传递符号时会遇到问题,例如" ~`!@#$%^& *()_- = +]} [{'& #34 ;;:,>"。并且没有输出。如果我只传递字符和数字,我会得到所需的输出。 谁能帮我这个。 在此先感谢我的代码。
这是我的代码。现在我在将数组传递给函数之前已经动态分配了数组
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void OriginalHex(int *buffer,int size,char *string)
{
int i;
for (i=0;string[i]!='\0';i++)
{
if(string[i] >= '0' && string[i] < 'A')
buffer[i] = string[i] - '0';
else if (string[i] >= 'A')
buffer[i] = string[i] - 'A' + 10;
}
}
void PackingTheHex(int *hex,int size,int *string)
{
int i=0,j=0;
for (i=0,j=0;i<size;i+=2,j++)
hex[j] = string[i]<<4 | string[i+1];
}
void HexToDec(int *newHex,int len,int *string)
{
int i=0,j,temp=0x00,l;
int mask = 0xFF;
for (i=0,j=0,l=0;i<len/2;i++,j++,l++)
{
if(j==8)
{
newHex[l] = temp & 0x7f;
temp = temp>>7;
j=1;
l+=1;
}
newHex[l] = ((string[i] & (mask>>j+1)) << j) | temp;
temp = string[i] >> (7-j);
}
}
int main(void)
{
int i;
char userString[512];
printf("\nEnter 8-Bit Packed Form String: ");
gets(userString);
printf("\n\nYou have Entered %s",userString);
int stringLen = strlen(userString);
printf("\n\nOringinal Hex: ");
int *hex = (int*)malloc(sizeof(int)*stringLen);
OriginalHex(hex,stringLen,userString);
for (i=0;i<stringLen;i++)
printf("%d ",hex[i]);
printf("\n\nPacking The Hex: ");
int *newHex = (int*)malloc(sizeof(int)*stringLen);
PackingTheHex(newHex,stringLen,hex);
for (i=0;i<stringLen/2;i++)
printf("%d ",newHex[i]);
free(hex);
printf("\n\nHex to Decimal Values are: ");
int *decHex = (int*)malloc(sizeof(int)*stringLen);
HexToDec(decHex,stringLen,newHex);
stringLen = stringLen + stringLen/8;
for (i=0;i<stringLen/2+1;i++)
printf("%d ",decHex[i]);
free(newHex);
char *ASCIIchar = (char*)malloc(sizeof(char)*stringLen);
for (i=0;i<stringLen/2+1;i++)
ASCIIchar[i] = (char)decHex[i];
ASCIIchar[i] = '\0';
printf("\n\nOriginal sentence is: %s",ASCIIchar);
free(decHex);
free(ASCIIchar);
}
答案 0 :(得分:1)
在PackingToHex中,您将返回具有自动存储持续时间的本地变量:
int* PackingToHex(int *string,int len)
{
int newHex[512];
...
return (&newHex[0]);
}
newHex的生命周期从函数返回时停止,存储空间可能会重复使用,通常在进程堆栈上。函数HexToDec()
遇到了同样的问题。
根据具体情况,快速修复可能是使用静态存储:
static int newHex[512];
在这种情况下,newHex的生命周期不受限制,但您必须记住,只有一个存储空间,每次调用{{1}时都会被覆盖}。如果这是一个问题,您将必须使用PackingToHex()
。
作为旁注:如果正确启用警告,编译器通常会警告此类错误,您可以通过监听编译器来避免许多错误。