比较急的问题,一个十六进制的长整型数据,请问如何调整各位的位置
大家好,有两个比较菜的问题,还请各位帮忙。
1、unsigned long SENSORDATAA[20]; SENSORDATAA[]={0x35343931,0xb32b3136,0xcda8bdc7......},我想把数据中的每个数据的各位数字的位置进行调整,比如0x35343931->0x31393435,0xb32b3136->36312bb3, 每个数据以每两个数据位进行倒叙排列。
2.有一字符串数据 char aa[][]={"aa","12","cc","ba"},请问如何转成十六进制的长整型数组,即:
unsigned long bb[]={0xaa,0x12,0xcc,0xba}。
本人对C语言不是太熟,这两个问题困扰我好几天了,上网查也没解决,还请各位慷慨相助。
[解决办法]
建议先把数字转换成十进制分析下数字变化规律再定算法。
[解决办法]
1、你想打乱原来的字符串顺序,对吧。
便于理解的办法:新建一个buf[20],将希望得到的新的元素顺序对号入座,比如你想SENSORDATAA[1]换成SENSORDATAA[10],直接buf[1] = SENSORDATAA[10],逐个操作你要改变顺序的数组元素,最后填充没有改变的元素,这样buf[20]就是你希望得到的数据了;如果你坚持要使用SENSORDATAA,就把buf的元素逐个copy给SENSORDATAA。
2、 这是你定义的字符串:char aa[][]={"aa","12","cc","ba"},说明每个元素都是char类型。你想转换成 unsigned long bb[]={0xaa,0x12,0xcc,0xba}类型,其实没有实际意义。我猜想你是要判断元素大小或者相等,其实你可以直接比较aa[0][0]和bb[0]的大小了,转换一次再操作,有脱裤子放屁的嫌疑。
[解决办法]
对于第一个问题:你可以这样做
unsigned long buffer[20]={0};
unsigned long mask=0xff;
int i=0;
for(;i<20;i++)
{
buffer[i]|=(SENSORDATAA[i]&mask)<<32;
buffer[i]|=(SENSORDATAA[i]&mask<<8)<<16;
buffer[i]|=(SENSORDATAA[i]&mask<<16)<<8;
buffer[i]|=SENSORDATAA[i]&mask<<32;
}
对于第二个问题:只给一个解决思路,代码就不写了;
你可以创建一个驱动表,驱动表分两列。第一列为对应的字母和数字,第二列为对应的掩码。对于一个字符,先查表,得到它对应的掩码。根据返回的掩码进行操作。
[解决办法]
大小端转换?蝶形交换:
temp=(SENSORDATAA[i]>>16)|(SENSORDATAA[i]<<16);
SENSORDATAA[i]=((temp&0xff00ff00)>>8)|((temp&0x00ff00ff)<<8);