C表中的2个Chars

时间:2013-07-21 02:58:28

标签: c int type-conversion short

我有2个字符。

Char 128和Char 2

如何将这些字符转换为C中的短640

我试过

unsigned short getShort(unsigned char* array, int offset)
{
    short returnVal;
    char* a = slice(array, offset, offset+2);
    memcpy(&returnVal, a, 2);
    free(a);
    return returnVal;
}

但是这不起作用,只是将其显示为128。什么是首选方法?

4 个答案:

答案 0 :(得分:3)

将两个字符a和b转换为短c的最简单方法可能如下:

short c = (((short)a) << 8) | b;

为了适应你的需要,最简单的方法可能就是这样:

unsigned short getShort(unsigned char* array, int offset)
{
    return (short)(((short)array[offset]) << 8) | array[offset + 1];
}

答案 1 :(得分:2)

我看到已经有了答案,但我对你原来的尝试发生了什么感到困惑。以下代码显示了您使用union的方法和技巧。两者似乎工作得很好。我想你可能遇到了一个字节序问题。无论如何,即使您的问题已经解决,也许这个演示会很有用。

#include <stdio.h>
#include <string.h>

int main()
{
    short returnVal;
    char a[2];
    union {
        char ch[2];
        short n;
    } char2short;

    a[0] = 128;
    a[1] = 2;

    memcpy(&returnVal, a, 2);

    printf("short = %d\n", returnVal);

    char2short.ch[0] = 128;
    char2short.ch[1] = 2;

    printf("short (union) = %d\n", char2short.n);

    return 0;
}

输出:

short = 640
short (union) = 640

答案 2 :(得分:2)

我发现接受的答案几乎是正确的,除了我遇到一个错误,有时结果的最高字节为0xff ...

我意识到这是由于C符号扩展引起的。如果第二个字符> = 0x80,则将0x80转换为short成为0xff80。对0xff80执行“或”操作会导致剩下的最高0xff字节。

以下解决方案通过在b的隐式转换为short期间将b的高位字节清零来避免该问题。

short c = (((short)a) << 8) | (0x00ff & b);

答案 3 :(得分:0)

我看到你实际上并没有尝试移位,而是将十六进制值的equivelant组合在一起,就像你在CSS中为颜色值着色一样。

提供此代码:

    char b1=128,b2=2;
    char data[16];

    sprintf((char *)data,"%x%x",(BYTE)b2,(BYTE)b1);
    short result=strtol(data,(char **)NULL, 16);