C进制转换和组合的问题 本帖最后由 jimever 于 2013-10-25 16:58:41 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 #include <stdio.h>typedef unsigned char uchar;void swap(uchar *c1, uchar *c2){ uchar t = *c1; *c1 = *c2; *c2 = t;}void display(uchar *arr, int len){ int i; for(i = 0; i < len; i++) printf("0x%02X ", arr[i]); putchar('\n');}void displayShort(short *arr, int len){ int i; for(i = 0; i < len; i++) printf("0x%04X ", arr[i]); putchar('\n');}int main(){ char recv[]={0x35,0x5D,0x03,0xE6}; display(recv, sizeof(recv)); swap(&recv[0], &recv[1]); swap(&recv[2], &recv[3]); display(recv, sizeof(recv)); displayShort((short*)recv, sizeof(recv)/sizeof(short)); return 0;}/* 运行结果: D:\profile\Desktop\test\c>a 0x35 0x5D 0x03 0xE6 0x5D 0x35 0xE6 0x03 0x355D 0x03E6*/ #define MAKESHORT(a,b) ((unsigned short)(((LONG)a<<8))|((LONG)b& 0xff))int _tmain(int argc, _TCHAR* argv[]){ char recv[]={0x35,0x5D,0x03,0xE6}; unsigned short pShort = 0; char a,b; for (unsigned int i = 0 ; i < sizeof(recv)/sizeof(short); i++) { a = recv[i*2];b = recv[i*2+1]; pShort = MAKESHORT(a,b); printf("十进制为 %d ",pShort); printf("十六进制 %x\r\n",pShort); } getchar(); return 0;} 写一个联合体不就行了嘛,还不用去考虑大端法和小端法。typedef union _tagUnion{ short nCombin; struct { char nFst; char nSec; }SEP;}OUT, *POUT;int main(){ OUT out; out.nFst = 0x35; out.nSec = 0x5D; printf("%d\n", out.nCombin); out.nFst = 0x03; out.nSec = 0xE6; printf("%d\n", out.nCombin); return 0;} 有个地方写错了:typedef union _tagUnion{ unsigned short nCombin; struct { char nFst; char nSec; }SEP;}OUT, *POUT;int main(){ OUT out; out.SEP.nFst = 0x35; out.SEP.nSec = 0x5D; printf("%d\n", out.nCombin); out.SEP.nFst = 0x03; out.SEP.nSec = 0xE6; printf("%d\n", out.nCombin); return 0;} char recv[]={0x35,0x5D,0x03,0xE6};short x1=((short)recv[0]<<8)|(recv[1]&0xFF);short x2=((short)recv[2]<<8)|(recv[3]&0xFF);printf("%d %d\n",x1,x2); 方法二:char recv[4]={0x35,0x5D,0x03,0xE6};char val[4];int i;short *x=(short *)val;for(i=0;i<4;i+=2){ val[i]=recv[i+1]; val[i+1]=recv[i];}printf("%d %d\n",*x,*(x+1)); MFC 窗口层次关系 问个极度奇怪的CHtmlView+WebBrowser控件的问题,50分奉送释疑者 如何在程序中改变属性页中某个页中的标题? 最简单的vb等效vc问题,100分相送 怎么在vs.net 2003中建立与数据库中字段的关联? 一个奇怪的问题 急! 来拿分啊!!!如何改变按钮控件的背景颜色! 请高手指点如何得到一幅图像的像素矩阵,感激涕零。 vc++开发中经常用到的类,结构,函数等 可以使用类似获取串口地址的方式获取并口地址吗?有没有获取并口地址的方法??求大神解救!!!! 对话框标题栏添加按钮什么的,怎么做的?
#include <stdio.h>typedef unsigned char uchar;void swap(uchar *c1, uchar *c2)
{
uchar t = *c1;
*c1 = *c2;
*c2 = t;
}void display(uchar *arr, int len)
{
int i;
for(i = 0; i < len; i++)
printf("0x%02X ", arr[i]);
putchar('\n');
}void displayShort(short *arr, int len)
{
int i;
for(i = 0; i < len; i++)
printf("0x%04X ", arr[i]);
putchar('\n');
}int main()
{
char recv[]={0x35,0x5D,0x03,0xE6}; display(recv, sizeof(recv)); swap(&recv[0], &recv[1]);
swap(&recv[2], &recv[3]); display(recv, sizeof(recv));
displayShort((short*)recv, sizeof(recv)/sizeof(short)); return 0;
}
/*
运行结果:
D:\profile\Desktop\test\c>a
0x35 0x5D 0x03 0xE6
0x5D 0x35 0xE6 0x03
0x355D 0x03E6
*/
#define MAKESHORT(a,b) ((unsigned short)(((LONG)a<<8))|((LONG)b& 0xff))int _tmain(int argc, _TCHAR* argv[])
{
char recv[]={0x35,0x5D,0x03,0xE6};
unsigned short pShort = 0;
char a,b;
for (unsigned int i = 0 ; i < sizeof(recv)/sizeof(short); i++)
{
a = recv[i*2];b = recv[i*2+1];
pShort = MAKESHORT(a,b);
printf("十进制为 %d ",pShort);
printf("十六进制 %x\r\n",pShort);
}
getchar();
return 0;
}
{
short nCombin;
struct
{
char nFst;
char nSec;
}SEP;}OUT, *POUT;
int main()
{
OUT out;
out.nFst = 0x35;
out.nSec = 0x5D;
printf("%d\n", out.nCombin); out.nFst = 0x03;
out.nSec = 0xE6;
printf("%d\n", out.nCombin); return 0;
}
{
unsigned short nCombin;
struct
{
char nFst;
char nSec;
}SEP;}OUT, *POUT;
int main()
{
OUT out;
out.SEP.nFst = 0x35;
out.SEP.nSec = 0x5D;
printf("%d\n", out.nCombin); out.SEP.nFst = 0x03;
out.SEP.nSec = 0xE6;
printf("%d\n", out.nCombin); return 0;
}
short x2=((short)recv[2]<<8)|(recv[3]&0xFF);
printf("%d %d\n",x1,x2);
char recv[4]={0x35,0x5D,0x03,0xE6};
char val[4];
int i;
short *x=(short *)val;for(i=0;i<4;i+=2)
{
val[i]=recv[i+1];
val[i+1]=recv[i];
}printf("%d %d\n",*x,*(x+1));