我的数据是12位,存储在16位值的数组中。他们只是价值< 4095。
我需要以8位块输出12位数据;顶行是输入值的12位,底行是输出值的8位。
11|10|09|08|07|06|05|04|03|02|01|00|11|10|09|08|07|06|05|04|03|02|01|00
07|06|05|04|03|02|01|00|07|06|05|04|03|02|01|00|07|06|05|04|03|02|01|00
所以对于输出数组: 第一个字节包含第一个12位值的前8位。 第二个字节包含第一个12位值的最后4位和第二个12位值的前4位。 第三个字节包含第二个值的最后8位。 等等...
理想情况下,我想将存储在16位数组中的12位数字数组转换为8位数组,其中值是连续的。
从技术上讲,它不必作为8位数组出来,当我逐步执行16位数组时,我可以通过函数SPI.Transfer(byte)
输出8位值。
答案 0 :(得分:0)
您需要首先指定字节顺序和术语。首先来自MSBit还是LSBit?无论如何,在商业中会有很多转移,或 ing,和。您的结果数据将采用源格式,字节顺序和第一个/最后一个观点。
假设前8位从最高有效位开始:
for(i = 0; i < Lenght_of_16_Bit_Array; i++)
{
if(i % 2 == 0)
i8 = a16[i] >> 4; // takes first 8-bit and chops least 4-bits
else
i8 = a16[i-1] << 4 | a16[i] >> 8 // takes least 4-bits of prior item and chops 8-bits of current item.
a8[i] = i8;
}
// last control if your initial length is an odd number(means the index is even)
if(Lenght_of_16_Bit_Array % 2 = 1)
a8[Lenght_of_16_Bit_Array] = a16[Lenght_of_16_Bit_Array - 1] & 0xF; //recover that last 4 bits
答案 1 :(得分:0)
这样可行;也许有更优雅的方式?
byteCount = 0;
for (int i = 0; i < numberOf16bitItems; i++) {
if (i % 2) {
//if odd then just grab the last 8 bits
toArray[byteCount] = fromArray[i] & 0b11111111;
byteCount++;
} else {
// if even get the first 8 bits and output, plus get the last 4 bits and the next bits of the next item
toArray[byteCount] = (fromArray[i] >> 4) & 0b11111111;
byteCount++;
toArray[byteCount] = ((fromArray[i+1] >> 8) & 0b1111) | (fromArray[i] & 0b1111 << 4);
byteCount++;
}
}