提一个超级简单的问题 ( 积分: 50 )

  • 主题发起人 主题发起人 anick
  • 开始时间 开始时间
A

anick

Unregistered / Unconfirmed
GUEST, unregistred user!
数据是'16 02 00 00 15 02 00 00'

type aaa = record
a1 : integer;
a2 : integer;
end;

我想把数据拆分成两个integer,实际上本来也就是两个integer,但是老是对不了位,得到的a1和a2并不是534,533
请知道的帮我看看怎么回事?如果我的不正确,应该怎么对位
 
忘了说我是这样写的

var
jilu : aaa;
shuju : string;
begin
shuju := '1602000015020000';
copymemory(@jilu,@shuju[1],length(shuju));
end;
 
Integer类型数据的低位在右边,对其执行左移操作会变大,右移操作会变小。
老兄可以考虑使用 htonl 函数进行反序操作。

如果是字符串,应该先用StrToInt('$'+Str)这样的语句对字符串进行转换,将其转化为
数字类型,然后再对其进行反序。
 
兄弟,我的integer就是从右边开始的,我没描述正确
16 02 00 00 15 02 00 00
是这样的,实际上就是$216和$215
是个数组,我用的copymemory,但是复制进去得到的a1和a2不对
结果超级奇怪,不知道怎么组合排列的,很久没摸了,我记得以前就是这样定义的
帮帮忙
 
你这样编的程,我都是头一次见,我在论坛骗了不少分,但完全看不懂你在写什么?
 
算我错了,我已经极度昏迷状态了,我自己写了一个demo,又是对的,我还是自己检查我的问题吧

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type aaa = record
a3 : array[0..3] of Byte;
a1 : integer;
a2 : integer;
a4 : array[0..1] of Byte;
end;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
suzu : aaa;
suju : array[0..13] of byte;
begin
suju[0] := $0;
suju[1] := $0;
suju[2] := $0;
suju[3] := $0;
suju[4] := $16;
suju[5] := $2;
suju[6] := $0;
suju[7] := $0;
suju[8] := $0;
suju[9] := $0;
suju[10] := $0;
suju[11] := $0;
suju[12] := $1;
suju[13] := $12;

copymemory(@suzu,@suju[0],10);
form1.Caption := inttostr(suzu.a1);


end;

end.
 
终于找到描述我的问题的方法了,朋友们,帮帮忙,我已经疯了,把这个代码复制到新建工程,增加一个按钮就就可以了

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

Type TRec = Record
a1 : Array[0..13] of Byte;
a2 : Integer;
a3 : Integer;
end;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
kankan : TRec;
suju : array[0..21] of byte;
begin
suju[0] := $0;
suju[1] := $0;
suju[2] := $0;
suju[3] := $0;
suju[4] := $0;
suju[5] := $0;
suju[6] := $0;
suju[7] := $0;
suju[8] := $0;
suju[9] := $0;
suju[10] := $0;
suju[11] := $0;
suju[12] := $0;
suju[13] := $0;
suju[14] := $0C;
suju[15] := $00;
suju[16] := $00;
suju[17] := $00;
suju[18] := $0B;
suju[19] := $00;
suju[20] := $00;
suju[21] := $00;

CopyMemory(@kankan,@suju[0],22);//Sizeof(kankan));


form1.Caption := inttostr(kankan.a2);
end;

end.
 
delphi里integer是4位的
16 02 00 00 15 02 00 00
a1,a2 : integer
a1:=($00 shl 24)+($00 shl 16)+($02 shl 8)+$15;
 
请帮我看一下我最后发的那个demo,输出的值不对,我的问题是我该怎样定义这个结构?数据很多,不可能来每一个都通过位移的方式
 
呵呵,不是其它的问题,只不过是record默认进行了4字节的对齐才导致问题的。
你的a1长度不是4的整数倍,所以a2和a1之间存在空隙,将record改为 packed record 就
会强制编译器消除空隙,结果就OK了。(ps:你可以用SizeOf检查一下TRec的大小,看看加
packed前后的大小变化,关于packed关键字,请参考Delphi的帮助)
 
哈哈,太感谢了,我是说以前可以对齐的,现在怎么不行了,我还以为编译器出了问题呢

感谢感谢,看起来我还是需要加强一下细节的学习
 
后退
顶部