我有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
。什么是首选方法?
答案 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);