将2个ASCII char值转换为short int

时间:2014-11-26 23:23:06

标签: c char short

我需要将两个ascii char值转换为一个short int。这是我的功能:

void char2short(char* pchar, short* pshort)
{
        int i;
        char* auxchar = pchar;
        short* auxshort = pshort;

        for(i = 0; i < KEYSIZE/2; i++)
        {
        *auxshort = (auxchar[0] << 8) | auxchar[1];
        auxshort++;
        auxchar += 2;
        }
}

然而,当我去打印出这些值时,我常常会在开始时获得一堆FFFF。从我的终端进行了复制:

    FFFFFFF7    FFFFFC24
    3049    3E1B
    FFFFFFE3    5705
    FFFFFFBC    FFFFA960
    FFFFFFB1    FFFFFF84
    FFFFFFEB    FFFFFFAD
    FFFFFFDA    FFFFFFCC
    FFFFFFB8    FFFFFFB0
    FFFFFFC7    1125

这是我试图转换的原始数字:

  static unsigned char keychar[]={
            0x8C,0xF7,0xFC,0x24,0x30,0x49,0x3E,0x1B,0x6D,0xE3,0x57,0x05,
            0x67,0xBC,0xA9,0x60,0x58,0xB1,0xBD,0x84,0xDD,0xEB,0xE8,0xAD,
            0x69,0xDA,0x49,0xCC,0x49,0xB8,0x5D,0xB0,0x42,0xC7,0x11,0x25}

感谢您的建议。

3 个答案:

答案 0 :(得分:1)

在算术之前,所有窄数据类型都会提升为int。你在许多地方做错的方式。

  • 首先,您的数据为unsigned char,但在功能中,您将其作为char
  • 可能char已在您的计算机上签名,因此您可以在之前没有得到负值。
  • 这些否定值会将符号展开为int并将其存储到short, 而不是unsigned short

让你的类型正确,这将有效。

答案 1 :(得分:1)

代码不必要地复杂,无法正确处理签名扩展,也无法在计算中升级到int

推荐:

// call this function for each pair of char by:
for(int i = 0; i < sizeof(keychar); i+=2)
{
    char2short( &keychar[i], &myshort );
    //  process myshort
}

void char2short(char* pchar, short* pshort)
{
    short result = 0;

    if( ('0' <= pchar[0]) && ('9' >= pchar[0]) )
    { 
        result +=  pchar[0]- '0'; 
    } // end if

    if( ('0' <= pchar[1]) && ('9' >= pchar[1]) )
    { 
        result *= 10;
        result +=  pchar[0 - '0'; 
    } // end if

    *pshort = result;
} // end function: char2short

你的问题不明确,也许你想连续两次char并将它们填入short然后

void char2short(char* pchar, short* pshort)
{
    char result[2] = {'0','0'};

    result |= pchar[0];
    result <<= 8;
    result |= pchar[1];

    *pshort = (short)result;
} // end function: char2short

- 甚至更简单 -

void char2short(char* pchar, short* pshort)
{
    *pshort = *(short*)pchar;
} // end function: char2short

答案 2 :(得分:0)

将循环更改为

 for(i = 0; i < KEYSIZE/2; i++)
    auxshort[i] = (keychar[i*2] << 8) | keychar[i*2+1];
取决于编译器,

char类型是signedunsigned。如果它是signed,则0x80到0xFF之间的所有字节都被认为是负数,并且当通过默认的int促销规则转换为int时,它们的值将是0xFFFFFF80到0xFFFFFFFF(32位int)。因此,在将它们提升为整数之前,必须将它们转换为无符号值。您的keychar数组声明为unsigned char,因此无需将任何内容添加到您的代码中。 在现代编译器和处理器上,指针算法通常不比数组索引快,但更难以读取,因此避免使用简单的代码。