我有一个设备发送有关其状态的几个字节信息,前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位字符串的函数...
是否有更容易的"简化和(我真正感兴趣的是)更快的程序来实现我的需要,或者这种方式是否足够好?
我发现它有点迟钝和肮脏...... :(虽然最终,它的目的是什么......所以最感兴趣的是学习观点)
答案 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;