C 将字符转换为短字符

C 将字符转换为短字符,c,char,short,C,Char,Short,我需要将数据从2char(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;

我需要将数据从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;
}
void char2short(char*pchar,short*pshort)
{
短aux;
aux=(*pchar&0x00FF)>8);
*pshort=aux;
}

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

*pshort = (uint16_t)(((unsigned int)pchar[0]) |
                    (((unsigned int)pchar[1])<<8));
*pshort=(uint16_t)((unsigned int)pchar[0])|
((unsigned int)pchar[1])
#包括
void char2short(无符号char*pchar,无符号short*pshort)
{
*pshort=(pchar[0]其他人没有解释为什么您的代码不起作用,所以我将快速尝试一下:

memcpy(pshort    , pchar + 1    , 1);
memcpy(pshort + 1, pchar    , 1);
添加到指针
TYPE*p
会以
sizeof(TYPE)
的增量移动指针(因此它确实指向下一个元素,请记住,这仅在数组中定义)。因此,虽然
pchar+1
是正确的,
pshort+1
不是(因为它正在寻址下一个
short


如果您在更大的上下文中使用它,请注意结构填充。

在执行按位操作时,请使用具有已知符号性的实际固定大小整数的健壮代码。这将防止您编写与隐式类型转换相关的错误,从而导致意外的符号性。
char
类型尤其危险,因为它具有正如实现定义的签名。它不应用于存储数字

#include <stdint.h>

void char2short(const uint8_t* pchar, uint16_t* pshort)
{
  *pshort = ((uint16_t)pchar[0] << 8) | (uint16_t)pchar[1];
}
#包括
无效字符2短(const uint8_t*pchar,uint16_t*pshort)
{

*pshort=((uint16_t)pchar[0]您不能以这种方式使用memcpy,因为它不能自动转换这些数据类型。您需要迭代src数组并将每个值转换为short。您需要知道short是否表示为。您需要知道pchar和pshort的endianness。如果它们相同,请使用
memcpy((void*)pshort,(const void*)pchar,sizeof(短)
Endianess在这里不是问题,至少在假设
pchar
下的数据不随系统的Endianess而变化时是如此,在您的示例中不是这样。如果这是一个16位系统,则在左移有符号数字8位时会出现问题。这会调用未定义的行为。不要使用邋遢的默认整数,不要写比特黑客时的打字!几年后到这里来告诉你你的答案有助于我完成论文,从而获得学位头衔!你棒极了!Gratulation.很高兴听到我能帮助你。这里的Endianess不是问题,至少在假设
pchar
下的数据不随系统的Endianess而变化的情况下是如此nion将使代码的尾数依赖。在大尾数系统上,您将得到预期的结果0x0102,但在小尾数系统上,您将得到0x0201。然后确实存在填充危险。因此,并集不是一个好主意,请使用位移位。@Lundin:根据您的需要,依赖尾数的结果实际上可能就是您想要的结果正在寻找。;-)但我同意,
union
有点不可靠。为了完整起见,我将其包括在内。为什么您会故意要编写依赖于endianess的代码?不管系统是什么,endianess都是100%的坏事。@Lundin:我曾经遇到过一两个系统,其中现有的API要求我编写代码,根据endianess的不同,这些代码的行为也会有所不同。(通常是因为另一方一开始没有考虑到endianess。)有时更改现有API不是一种选择。
aux = ((*pchar & 0x00FF) << 8) | ((*(pchar+1) & 0xFF00) >> 8);
 #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;
  }
#include <stdint.h>

void char2short(const uint8_t* pchar, uint16_t* pshort)
{
  *pshort = ((uint16_t)pchar[0] << 8) | (uint16_t)pchar[1];
}