6

我有2个字符。

字符128和字符2

如何将这些字符转换为640C 中的 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

将两个字符 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 回答
4

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

我意识到这是因为 C 符号扩展。如果第二个 char 是 >= 0x80,则转换0x80为 short 变为0xff80. 对任何内容执行“或”会0xff80导致顶部字节剩余0xff

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

short c = (((short)a) << 8) | (0x00ff & b);
于 2018-08-05T15:14:16.143 回答
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 中为值着色一样。

试一下这段代码:

    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 回答