TCommBlock = record //数据包
VAR1 : Smallint ;
VAR2 : Real ;
end;WriteCommBlock.VAR1 := 2 ;
WriteCommBlock.VAR2 := 2000 ;AThread.Connection.WriteBuffer (WriteCommBlock, SizeOf (WriteCommBlock), true);在报文内数据为2 = 02 00,2000 = D0 07
可是实际需要 2 = 00 02,2000= 07 D0
求教如何处理才能满足实际需要
VAR1 : Smallint ;
VAR2 : Real ;
end;WriteCommBlock.VAR1 := 2 ;
WriteCommBlock.VAR2 := 2000 ;AThread.Connection.WriteBuffer (WriteCommBlock, SizeOf (WriteCommBlock), true);在报文内数据为2 = 02 00,2000 = D0 07
可是实际需要 2 = 00 02,2000= 07 D0
求教如何处理才能满足实际需要
解决方案 »
- 最新Delphi版电子体温单控件
- 如何在动态显示出来数据的时候将DBGridEH的列的标题居中显示
- 关于海康的ds-40XXhc的卡的delphi demo请问哪能位大哥有呀,给小弟了一个,谢谢了。
- 关于mscomm32.ocx问题????
- 菜鸟请教:怎么安装组件包?问题解决马上给分
- 请问哪里有关于数据库多线程查询的文章?谢谢
- 看别人写的代码,他门写的过程和函数的参数列表都十分灵活,因为看见他门写的过程和函数没有那个参数列表的参数是相同的
- XML解析/生成算法+SQL通配符验证算法
- 请问d7自带的控件哪个根据财务数据生成折线图效果最好
- 在数据库查询中,怎么样实现象VB中WHERE LIKE语句的效果?
- vc++ 的dll 的函数转换成delphi不能调和
- 关于DEPHI动态库的问题
function ByteSwap2(value:Word):Word; assembler;
asm
BSWAP eax
shr eax, 16
end;//function ByteSwap4(value:DWord):DWord; assembler;
//asm
// BSWAP eax
//end;var
W:Word;
begin
W := 2;
W := ByteSwap2(W);
end;
或者
function ByteSwap2(value:Word):Word; assembler;
asm
BSWAP eax
shr eax, 16
end;
均可成功对2字节的数据进行转换但是4字节的无法使用API htons
function ByteSwap4(value:DWord):DWord; assembler;
asm
BSWAP eax
end;
使用时会提示invalid floating point operation
htonl取到Invalid floating point operation,是不是你对浮点数进行了换位?
htonl(host to network long)
function ByteSwap4(value:Single):Single; assembler;
asm
MOV EAX,value
BSWAP EAX
MOV @result,EAX
end;可是出现一个新的奇怪现象发送2个Smallint时,长度为4,正常。
TCommBlock = record //数据包
VAR1 : Smallint ;
VAR2 : Smallint ;
end; 发送2个Single时,长度为8,也正常。
TCommBlock = record //数据包
VAR1 : Single ;
VAR2 : Single ;
end;
可是发送一个Smallint和一个Single时,长度是8,而不是2+4=6。
TCommBlock = record //数据包
VAR1 : Smallint ;
VAR2 : Single ;
end;
反复测试后发现,当连续的2个数据为不同类型时,中间会自动插入2个字节。不知为何。
比如
TCommBlock = record //数据包
VAR1 : Smallint ;
VAR2 : Single ;
VAR3 : Smallint ;
end;
长度为12,而不是2+4+2=8使用的是IdTcpServer的Writebuf方法。
var
S: Single;
S1: Single;
S2: Single;
dw: Dword;
begin
S := 100.5;
dw := ByteSwap4(PDWord(@S)^);
S1 := PSingle(@dw)^ ;
ShowMessage(Format('%f',[S1]));
dw := ByteSwap4(PDWord(@S1)^);
S2 := PSingle(@dw)^;
ShowMessage(Format('%f',[S2]));
end;//任意位的转换
procedure SizedByteSwap(value:PChar;Size:Integer);
var
S,E: PChar;
T: Char;
begin
if Value = Nil then Exit;
if Size < 2 then Exit; S := Value;
E := PChar(Integer(Value) + Size - 1);
repeat
T := E^;
E^ := S^;
S^ := T;
Inc(S);
Dec(E);
until (S>=E);
end;var
R: Real;begin
R := 100.5;
SizedByteSwap(PChar(@R),sizeof(R));
ShowMessage(Format('%f',[r]));
SizedByteSwap(PChar(@R),sizeof(R));
ShowMessage(Format('%f',[r]));
end;
是定义结构的字节对齐问题。Project-Option-Compiler->Code generation->Record field alignment 设成1
或者定义结构加 packed