我需要将数据从2 char
(8位长)复制到单个short
(16位长)。我尝试了两种不同的方法,但无法让它发挥作用。
void char2short(char* pchar, short* pshort)
{
memcpy(pshort , pchar + 1 , 1);
memcpy(pshort + 1, pchar , 1);
}
另一个:
void char2short(char* pchar, short* pshort)
{
short aux;
aux = ((*pchar & 0x00FF) << 8) | ((*(pchar+1) & 0xFF00) >> 8);
*pshort = aux;
}
答案 0 :(得分:9)
#include <stdio.h>
void char2short(unsigned char* pchar, unsigned short* pshort)
{
*pshort = (pchar[0] << 8) | pchar[1];
}
int main()
{
unsigned char test[2];
unsigned short result = 0;
test[0] = 0xAB;
test[1] = 0xCD;
char2short(test, &result);
printf("%#X\n",result);
return 0;
}
这将完成这项工作。
答案 1 :(得分:6)
假设pchar
是一个包含2个字符的数组,那么:
*pshort = (uint16_t)(((unsigned int)pchar[0]) |
(((unsigned int)pchar[1])<<8));
P.S。这项工作对于小小的结束。
答案 2 :(得分:5)
其他人没有解释为什么你的代码无效,所以我会快速尝试一下:
memcpy(pshort , pchar + 1 , 1);
memcpy(pshort + 1, pchar , 1);
添加指针TYPE * p
会以sizeof( TYPE )
的增量移动指针(因此它确实指向下一个元素,请记住,只有已定义,如果在里面一个数组)。因此,虽然pchar + 1
是正确的,但pshort + 1
不正确(因为它正在处理下一个short
)。
aux = ((*pchar & 0x00FF) << 8) | ((*(pchar+1) & 0xFF00) >> 8);
错误......右手边的方式多于一个方面。首先,*(pchar+1)
是char
,而& 0xFF00
上的char
总是会产生0(因为char
开始时只有8位,至少在当代机器上...)。然后你将那8位向右移动......?
如果您没有意识到这一点,如果您没有在左侧使用0x00FF(将*pchar
提升到右侧操作数的宽度)但是({{1} } -sized)0xFF,该操作的结果仍然是类型char
,并且将该8位向左移位也没有多大意义(因为类型不会神奇地扩展)。 / p>
另一种未提及的方法是char
:
union
如果您在更大的上下文中使用它,请注意struct padding。
答案 3 :(得分:2)
执行按位运算时,请使用具有已知签名的实际固定大小整数的强健代码。这将阻止您编写与隐式类型转换相关的错误,从而导致意外的签名。 char
类型特别危险,因为它具有实现定义的签名。它永远不应该用于存储数字。
#include <stdint.h>
void char2short(const uint8_t* pchar, uint16_t* pshort)
{
*pshort = ((uint16_t)pchar[0] << 8) | (uint16_t)pchar[1];
}