我需要将数据从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)
#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)
这将完成这项工作.
假设pchar是一个包含2个字符的数组,那么:
*pshort = (uint16_t)(((unsigned int)pchar[0]) |
(((unsigned int)pchar[1])<<8));
Run Code Online (Sandbox Code Playgroud)
PS这项工作对于小小的结束.
其他人没有解释为什么你的代码不起作用,所以我会快速尝试一下:
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.
| 归档时间: |
|
| 查看次数: |
7507 次 |
| 最近记录: |