【问题标题】:2 Chars to Short in CC 中的 2 个字符短
【发布时间】:2013-07-20 01:39:55
【问题描述】:

我有 2 个字符。

字符128 和字符2

如何在 C 中将这些字符转换为 Short 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。首选的方法是什么?

【问题讨论】:

    标签: c int type-conversion short


    【解决方案1】:

    将两个字符 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
    • 这取决于你有两个字符的顺序。32770 = 128
    • @qalpha 到底是什么...我以正确的顺序排列它们 [128, 2] 但交换值有效。那是怎么回事?
    • 我猜这与您机器的 [endianness]{en.wikipedia.org/wiki/Endianness} 有关。最高有效字节似乎在最左边,而您的工作就像最高有效字节在最右边一样。
    • @qalpha 好像我的处理器是 Little-Endian。你的方法是为 Big-Endian 设计的吗?
    【解决方案2】:

    我发现您实际上并没有尝试移动位,而是将十六进制值的等值组合在一起,就像您在 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);
    

    【讨论】:

    • 这似乎是一种非常迂回的做事方式。
    • 是的,我实际上同意,但我最初真的很困惑 SuperDisk 如何从 128 和 2 的值到达 640。将 2 转换为十六进制,即“2”,将 128 转换为十六进制,即“80”。将它们拼在一起并获得十六进制值“280”,现在将其转换为短值。所有组合中的位移都不会产生 640。
    【解决方案3】:

    我看到已经有了答案,但是我对您最初的尝试发生了什么感到有些困惑。以下代码显示了您使用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

    【讨论】:

    • 我喜欢联合法!感谢您的回答。
    【解决方案4】:

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

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

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

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

    【讨论】:

    • 如果您使用的是无符号字符,qalpha 的答案是正确的。但对于普通字符,你需要这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2013-05-20
    相关资源
    最近更新 更多