我的Form上有100个CheckBox,通过串口将这100个CheckBox的ItemIndex发送出去,我原来做的程序是这
100个ItemIndex占100个字节,但现在要改,100个ItemIndex占20个字节,具体的协议是:
0 1 0 × × × × ×
例如:如果前五个CheckBox都选中的话,那第一个字节中的8位就是:0 1 0 1 1 1 1 1
每个字节的前三位固定是 0 1 0 ,后五位表示五个连续的CheckBox的选中情况。
我现在要问的是:怎样将这100个字节的数据通过协议转化为20个字节。
顺便说一下,程序已经作好了,这20个字节的数据是临时加上的。前面的数据发送的时候,
我已经将所有的数据定义到一个byte类型的数组里面。而且能实现预定的功能。
所以,主要问题就是把这100个ItemIndex转化为20个字节的byte类型的数据,
例如:如果第一个字节是01011111,那我就可以这样定义:byte[i] :=95,以此类推,总共20个字节。
快过年了,时间比较紧,还望各位大侠指点。谢谢!预祝各位新年快乐!

解决方案 »

  1.   

    var
      A1 : array[0..99] of Byte;//如果这两个数组的下标不是从0开始的,要推算并修改下面的I,J用法
      A2 : array[0..19] of Byte;
      I,J: integer;
    begin
      fillChar(A1,100,1);//这句仅是我调试用的:把100个元素全部置为1,即“选中”
      for I := low(A2) to High(A2) do
        begin
        A2[I] := 64;
        for J := I*5 to I*5+4 do
          A2[I] := A2[I] + (A1[J] shl (J-I*5));
        end;
      { 至此,A2数组元素全部为95 }
    end;
      

  2.   

    //参考如下代码
    var
      vBytes: array[0..20 - 1] of Byte;
      vCheckBox: TCheckBox;
      I: Integer;
    begin
      FillChar(vBytes, SizeOf(vBytes), 0);
      for I := 0 to 100 - 1 do
      begin
        TComponent(vCheckBox) := FindComponent(Format('CheckBox%d', [I + 1]));
        vBytes[I div 8] := vBytes[I div 8] or
          (Ord(Assigned(vCheckBox) and vCheckBox.Checked) shl (7 - I mod 8));
      end;
    end;
      

  3.   

    array[0..20 - 1] of Byte;
    数组每个元素初始化为2^6=64.
    然后根据itemIndex判断该用哪个array[],即将checkbox分成了20组,每组5个
    在每组里若第一个选中,则用array[] 按位或(or) 00000001($1),若第二个选中,则用array[] 按位或 00000010,若第三个选中,则用array[] 按位或 00000100,......
    最后数组就是你要的.
      

  4.   

    $为16进制表示,delphi好象没有2,8进制表示