我有 65 个不同位长的参数,我需要填写一个八位字节字符串。参数将在八位字节字符串中连续填充。例如,假设第一个参数是 1 位长,因此它将在八位字节字符串的第一个八位字节的第 0 位位置填充。现在第二个参数假设为 9 位长。因此,该参数的前 7 位将被填充到相同的八位字节中,接下来的 2 位应位于下一个八位字节的第 0 位和第 1 位位置。类似地,其他参数将被填充到八位字节字符串中。我试图编写一个函数,其中我将指针传递给当前八位字节、位位置和源指针,数据将从那里复制。但我发现逻辑实现有困难。我尝试了许多逻辑(位操作、位移、旋转等),但无法获得正确的逻辑。如果有人可以在“C”中给我一个逻辑/功能,我将不胜感激。您也可以使用不同的函数原型。
我编写了一个 16 位的代码,如下所示:
void set16BitVal(U8** p_buf, U8* bitPos, U16 src)
{
U16 ctr;
U16 bitVal;
U16 srcBitVal;
U16 tempSrc = src;
U8 temp = **p_buf;
printf("\n temp = %d\n", temp);
for(ctr=0; ctr<16; ctr++)
{
bitVal = 1;
bitVal = bitVal << ctr;
srcBitVal = src & bitVal;
temp = temp | srcBitVal;
**p_buf = temp;
if(srcBitVal)
srcBitVal = 1;
else
srcBitVal = 0;
printf("\n bit = %d, p_buf = %x \t p_buf=%d bitPos=%d ctr=%d srcBitVal = %d\n",\
tempSrc, *p_buf, **p_buf, *bitPos, ctr, srcBitVal);
*bitPos = (*bitPos+1)%8; /*wrap around after bitPos:7 */
if(0 == *bitPos)
{
(*p_buf)++; /*jump to next octet*/
temp = **p_buf;
printf("\n Value of temp = %d\n", temp);
}
//printf("\n ctr=%d srcBitVal = %d", ctr, srcBitVal);
printf("\n");
}
}
但问题是假设如果我通过 src=54647,我会得到以下输出:
温度 = 0
位 = 54647,p_buf = bf84da4b p_buf = 1 位位置 = 0 ctr = 0 srcBitVal = 1
bit = 54647, p_buf = bf84da4b p_buf=3 bitPos=1 ctr=1 srcBitVal = 1
bit = 54647, p_buf = bf84da4b p_buf=7 bitPos=2 ctr=2 srcBitVal = 1
bit = 54647, p_buf = bf84da4b p_buf=7 bitPos=3 ctr=3 srcBitVal = 0
bit = 54647, p_buf = bf84da4b p_buf=23 bitPos=4 ctr=4 srcBitVal = 1
bit = 54647, p_buf = bf84da4b p_buf=55 bitPos=5 ctr=5 srcBitVal = 1
bit = 54647, p_buf = bf84da4b p_buf=119 bitPos=6 ctr=6 srcBitVal = 1
bit = 54647, p_buf = bf84da4b p_buf=119 bitPos=7 ctr=7 srcBitVal = 0
温度值 = 0
位 = 54647,p_buf = bf84da4c p_buf=0 bitPos=0 ctr=8 srcBitVal = 1
位 = 54647,p_buf = bf84da4c p_buf=0 bitPos=1 ctr=9 srcBitVal = 0
bit = 54647, p_buf = bf84da4c p_buf=0 bitPos=2 ctr=10 srcBitVal = 1
位 = 54647, p_buf = bf84da4c p_buf = 0 位位置 = 3 ctr = 11 srcBitVal = 0
bit = 54647, p_buf = bf84da4c p_buf=0 bitPos=4 ctr=12 srcBitVal = 1
bit = 54647, p_buf = bf84da4c p_buf=0 bitPos=5 ctr=13 srcBitVal = 0
位 = 54647,p_buf = bf84da4c p_buf=0 bitPos=6 ctr=14 srcBitVal = 1
位 = 54647,p_buf = bf84da4c p_buf=0 bitPos=7 ctr=15 srcBitVal = 1
温度值 = 0
然而,预期的输出是:下一个字节应该开始填充 src 的第 8 位以上的值。
有人可以帮我解决吗?