6

私は2文字を持っています。

シャア128とシャア2

640これらの文字をCの Short に変換するにはどうすればよいですか?

私はもう試した

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

4 に答える 4

6

おそらく、2 つの文字 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];
}
于 2013-07-21T03:04:01.700 に答える
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;
}

出力:

ショート = 640
ショート (ユニオン) = 640
于 2013-07-21T07:26:58.310 に答える
0

実際にビットをシフトしようとしているのではなく、CSS で値を色付けするように、16 進値の等価物を一緒に組み立てようとしていることがわかります。

このコードを試してみてください:

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

    sprintf((char *)data,"%x%x",(BYTE)b2,(BYTE)b1);
    short result=strtol(data,(char **)NULL, 16);
于 2013-07-21T03:44:56.360 に答える