逐字节读取 - 简化/加速建议 - Delphi

时间:2014-11-28 01:27:10

标签: delphi byte bit delphi-xe3

我有一个设备发送有关其状态的几个字节信息,前5个字节是40个按钮的状态。每个位代表一个按钮,1表示释放,0表示按下。

从那件事情,我正在使用这段代码进行结账:

procedure TForm2.ServerUDPRead(AThread: TIdUDPListenerThread;
  AData: array of Byte; ABinding: TIdSocketHandle);
var received: array [0..4] of string; a1, a2 integer;
bits: array [0..40] of boolean;
begin

for a1 := 0 to 4 do
  Received[a1] := (ByteToBin(AData[a1]));

for a1 := 4 downto 0 do
  begin
    for a2 := 1 to 8 do
      begin
        if Copy(Received[a1], a2, 1) = '0' then bits[(4-a1)*8+(a2-1)]:=False else bits[(4-a1)*8+(a2-1)]:=True;
      end;
  end;

ByteToBin是将字节转换为8位字符串的函数...

是否有更容易的"简化和(我真正感兴趣的是)更快的程序来实现我的需要,或者这种方式是否足够好?

我发现它有点迟钝和肮脏...... :(虽然最终,它的目的是什么......所以最感兴趣的是学习观点)

2 个答案:

答案 0 :(得分:3)

通过这种方式,您可以直接从AData转换为布尔数组:

for i := 0 to 39 do
  bits[i] :=  (AData[i div 8] and (1 shl (i mod 8))) <> 0;

我不确定布尔值的顺序是否完全相同,我的所有索引都没有计数:)

答案 1 :(得分:2)

另一种方法是使用集合:

type
  TByteSet = set of 0..7;
...
  for I := 0 to 39 do begin
    bits[I] := (I mod 8) in TByteSet(AData[I div 8]);
  end;