将char转换为short

ANI*_*TEK 7 c short char

我需要将数据从2 char(8位长)复制到单个short(16位长).我尝试了两种不同的方法,但无法让它发挥作用.

void char2short(char* pchar, short* pshort)
{
    memcpy(pshort    , pchar + 1    , 1);
    memcpy(pshort + 1, pchar    , 1);
}
Run Code Online (Sandbox Code Playgroud)

而另一个:

void char2short(char* pchar, short* pshort)
{
   short aux;
   aux = ((*pchar & 0x00FF) << 8) | ((*(pchar+1) & 0xFF00) >> 8);
   *pshort = aux;
}
Run Code Online (Sandbox Code Playgroud)

mch*_*mch 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;
}
Run Code Online (Sandbox Code Playgroud)

这将完成这项工作.

  • Endianess在这里不是问题,至少假设`pchar`下的数据不会根据系统的endianess而改变,这在你的例子中并非如此. (3认同)
  • 如果这是一个16位系统,当你将有符号数8位移位时会遇到问题.这会调用未定义的行为.在编写bit hacks时不要使用sloppy默认整数类型! (2认同)

Coc*_*nop 6

假设pchar是一个包含2个字符的数组,那么:

*pshort = (uint16_t)(((unsigned int)pchar[0]) |
                    (((unsigned int)pchar[1])<<8));
Run Code Online (Sandbox Code Playgroud)

PS这项工作对于小小的结束.

  • Endianess在这里不是问题,至少假设`pchar`下的数据不会根据系统的endianess而改变. (2认同)

Dev*_*lar 5

其他人没有解释为什么你的代码不起作用,所以我会快速尝试一下:

memcpy(pshort    , pchar + 1    , 1);
memcpy(pshort + 1, pchar    , 1);
Run Code Online (Sandbox Code Playgroud)

添加到指针TYPE * p通过的增量移动的指针sizeof( TYPE )(因此它指向下一个元素,记住这仅定义如果内部阵列).所以虽然pchar + 1是正确的,但pshort + 1不是(因为它正在解决下一个问题short).

aux = ((*pchar & 0x00FF) << 8) | ((*(pchar+1) & 0xFF00) >> 8);
Run Code Online (Sandbox Code Playgroud)

Errr ....右手边的方式多于一个.首先,*(pchar+1)是a char,并且& 0xFF00a char将始终产生0(因为a char只有8位开头,至少在现代机器上......).然后你把那8位向右移......?

如果你没有意识到它,如果你没有在左侧使用0x00FF(提升*pchar到右侧操作数的宽度)但是(char-sized)0xFF,那么该操作的结果仍然是是类型的char,并且向左移动8位也没有多大意义(因为类型不会神奇地扩展).


另一种未提及的方法是union:

 #include <stdio.h>

 struct chars_t
 {
     // could also go for char[2] here,
     // whichever makes more sense semantically...
     char first;
     char second;
 };

 union combo_t
 {
      // elements of a union share the memory, i.e.
      // reside at the same address, not consecutive ones
      short shrt;
      struct chars_t chrs;
 };

 int main()
 {
     union combo_t x;
     x.chrs.first = 0x01;
     x.chrs.second = 0x02;
     printf( "%x", x.shrt );
     return 0;
  }
Run Code Online (Sandbox Code Playgroud)

如果您在更大的上下文中使用它,请注意struct padding.