在C语言中将2个字符转换为短整型

7

我有两个字符。

字符128和字符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个回答

8

将两个字符 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];
}

通过您的修改,它输出的是“32770”,而不是“640”。 - Name McChange
@qalpha 到底是怎么回事...我已经按正确的顺序[128, 2]排列了,但交换值却奏效了。这是怎么回事? - Name McChange
我猜测这与你的机器的字节序有关。看起来最重要的字节在最左边,而你却按照最重要的字节在最右边的方式进行操作。 - qaphla
@qalpha 看起来我的处理器是 Little-Endian。你的方法设计是针对 Big-Endian 的吗? - Name McChange
@qalpha 好的,我确信这将在小端系统上运行,所以我现在没问题了。谢谢! - Name McChange
显示剩余2条评论

5

我发现接受的答案几乎是正确的,只不过有时候结果的最高字节会是0xff...

我意识到这是由于C语言的符号扩展造成的。如果第二个字符大于或等于0x80,那么将0x80转换为short类型就变成了0xff80。对0xff80进行"或"运算的结果仍然是0xff

下面的解决方案通过在b隐式转换为short类型时清除其最高字节来避免这个问题。

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

如果您使用的是无符号字符,则qalpha的答案是正确的。但对于普通字符,您需要这个。 - fafrd

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(联合)= 640

我喜欢 Union 方法!感谢您的回答。 - Name McChange

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);

这似乎是一个非常绕弯子的做事方式。 - tangrs
是的,我同意这一点,但最初我真的很困惑SuperDisk是如何从128和2的值中得出640的。将2转换为十六进制,即“2”,将128转换为十六进制,即“80”。将它们组合在一起并获得十六进制值“280”,现在将其转换为short。所有组合中的位移都没有产生640。 - sthede

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接