我有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 BITPOS = 0 CTR = 0 srcBitVal = 1
位= 54647,P_BUF = bf84da4b P_BUF = 3 BITPOS = 1 CTR = 1 srcBitVal = 1
位= 54647,P_BUF = bf84da4b P_BUF = 7 BITPOS = 2 CTR = 2 srcBitVal = 1
位= 54647,P_BUF = bf84da4b P_BUF = 7 BITPOS = 3 CTR = 3 srcBitVal = 0
位= 54647,P_BUF = bf84da4b P_BUF = 23 BITPOS = 4 CTR = 4 srcBitVal = 1
位= 54647,P_BUF = bf84da4b P_BUF = 55 BITPOS = 5 CTR = 5 srcBitVal = 1
位= 54647,P_BUF = bf84da4b p_buf = 119 bitPos = 6 ctr = 6 srcBitVal = 1
位= 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
位= 54647,P_BUF = bf84da4c P_BUF = 0 BITPOS = 2 CTR = 10 srcBitVal = 1
bit = 54647,p_buf = bf84da4c p_buf = 0 bitPos = 3 ctr = 11 srcBitVal = 0
位= 54647,P_BUF = bf84da4c P_BUF = 0 BITPOS = 4 CTR = 12 srcBitVal = 1
位= 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
的价值temp = 0
但是,预期的输出是:下一个字节应该从src的第8位开始填充。
有人可以帮我解决它吗?
不要发布一个新的问题,编辑[你已经问一个相同(http://stackoverflow.com/questions/14217224/pack-in-an-octet-string)。我正在投票结束,因为这一个包含额外的信息。 – Lundin