将char转换为short

时间:2014-09-11 12:22:38

标签: c char short

我需要将数据从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;
}

4 个答案:

答案 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];
}
相关问题