GSM PDU解码算法表现得很奇怪

时间:2017-11-05 14:46:38

标签: c

大家好我已经改进了我的代码.. 这段代码适用于任意数量的字符,但是当我传递符号时会遇到问题,例如" ~`!@#$%^& *()_- = +]} [{'& #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);

}

1 个答案:

答案 0 :(得分:1)

在PackingToHex中,您将返回具有自动存储持续时间的本地变量:

int* PackingToHex(int *string,int len)
{
    int newHex[512];
    ...
    return (&newHex[0]);
}

newHex的生命周期从函数返回时停止,存储空间可能会重复使用,通常在进程堆栈上。函数HexToDec()遇到了同样的问题。

根据具体情况,快速修复可能是使用静态存储:

static int newHex[512];

在这种情况下,newHex的生命周期不受限制,但您必须记住,只有一个存储空间,每次调用{{1}时都会被覆盖}。如果这是一个问题,您将必须使用PackingToHex()

来动态分配内存

作为旁注:如果正确启用警告,编译器通常会警告此类错误,您可以通过监听编译器来避免许多错误。