Delphi byte[]转换为int

hfliyy 2010-01-29 04:05:14
buf : array[0..1] of byte;

buf[0] := $01;
buf[1] := $02;



bus : array[0..3] of byte;

bus[0] := $00;
bus[1] := $01;
bus[2] := $02;
bus[3] := $03;

怎么把数组buf和bus转换为smallint和integer类型?多谢!!
...全文
1057 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hfliyy 2010-01-29
  • 打赏
  • 举报
回复
我想结果是20呢!大端小端真是头痛,原来你们都是对的。
老之 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hfliyy 的回复:]
9楼:
var
    buf : array[0..1] of byte;
    aBuf : Psmallint;
begin
    buf[0] := $00;
    buf[1] := $14;
    aBuf := @buf[0];
    showMessage(intToStr(aBuf^));
end;

结果怎么是5120?
[/Quote]

这个是正解, 低位在前,高位在后,相当于 $1400 即5120
kfcoffe 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hfliyy 的回复:]
9楼:
var
buf : array[0..1] of byte;
aBuf : Psmallint;
begin
buf[0] := $00;
buf[1] := $14;
aBuf := @buf[0];
showMessage(intToStr(aBuf^));
end;

结果怎么是5120?
[/Quote]

那不是5120是多少?内存中就是这个样子$00$14(小端,我们通常书写$14$00),转化为10进制 ---1*16*16*16+4*16*16=5120
hfliyy 2010-01-29
  • 打赏
  • 举报
回复
9楼:
var
buf : array[0..1] of byte;
aBuf : Psmallint;
begin
buf[0] := $00;
buf[1] := $14;
aBuf := @buf[0];
showMessage(intToStr(aBuf^));
end;

结果怎么是5120?
liangpei2008 2010-01-29
  • 打赏
  • 举报
回复

另一个用PSmallInt
var
buf : array[0..1] of byte;
Pint:PSmallInt;
begin
buf[0] := $01;
buf[1] := $02;

Pint:=@buf[0];
ShowMessage(IntToStr( Pint^));
end;
liangpei2008 2010-01-29
  • 打赏
  • 举报
回复

类型转换
用个Integer指针直接指向字节数组就OK了,如果就想看看转换结果的话,MOVE都不用了
var
buf : array[0..3] of byte;
Pint:PInteger;
begin
buf[0] := $00;
buf[1] := $01;
buf[2] := $02;
buf[3] := $03;
Pint:=@buf[0];
ShowMessage(IntToStr( Pint^));
end;
buding79 2010-01-29
  • 打赏
  • 举报
回复
楼主测试一下吧!!!!!!!!!!!!!!!!!!
呵呵呵呵呵。
kfcoffe 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hfliyy 的回复:]
2楼 3楼 4楼 : 你们取出来的都是地址。
[/Quote]

lz确定我们取出来地都是地址?你试了没有?

buf: array[0..1] of byte;
bus: array[0..3] of byte;
i:SmallInt ;
j:Integer ;
begin
buf[0] := $01;
buf[1] := $02;
bus[0] := $00;
bus[1] := $01;
bus[2] := $02;
bus[3] := $03;

i := (I shl 16) or buf[1];
i := (I shl 8) or buf[0];

j := (J shl 32) or bus[3];
j := (J shl 24) or bus[2];
j := (J shl 16) or bus[1];
j := (J shl 8) or bus[0];
self.Memo1.Lines.Add(IntToStr(i));
self.Memo1.Lines.Add(IntToStr(j));


hfliyy 2010-01-29
  • 打赏
  • 举报
回复
2楼 3楼 4楼 : 你们取出来的都是地址。
kfcoffe 2010-01-29
  • 打赏
  • 举报
回复
i:smallint;
j:integer;

i := (I shl 16) or buf[1];
i := (I shl 8) or buf[0];

j := (J shl 32) or bus[3];
j := (J shl 24) or bus[2];
j := (J shl 16) or bus[1];
j := (J shl 8) or bus[0];

(注意:根据大端或者小段做小相应的调整即可)
xzhifei 2010-01-29
  • 打赏
  • 举报
回复

var
buf: array[0..1] of byte;
bus: array[0..3] of byte;
si:SmallInt ;
i:Integer ;
begin
buf[0] := $01;
buf[1] := $02;
bus[0] := $00;
bus[1] := $01;
bus[2] := $02;
bus[3] := $03;

Move(buf,si,SizeOf(SmallInt) );
ShowMessage(IntToStr(si));

Move(bus,i,SizeOf(Integer) );
ShowMessage(IntToStr(i));
buding79 2010-01-29
  • 打赏
  • 举报
回复
//这个应该就可以了。
var
buf : array[0..1] of byte;
bus : array[0..3] of byte;
i:smallint;
j:integer;
begin
buf[0] := $01;
buf[1] := $02;
move(buf[0],i,2);

bus[0] := $00;
bus[1] := $01;
bus[2] := $02;
bus[3] := $03;
move(bus[0],j,4);
end;
hongqi162 2010-01-29
  • 打赏
  • 举报
回复
var
buf : array[0..1] of byte;
bus : array[0..3] of byte;
function ByteToHex(InByte:byte):shortstring;
const Digits:array[0..15] of char='0123456789ABCDEF';
begin
result:=digits[InByte shr 4]+digits[InByte and $0F];
end;
function BinArrayToString(aArray: array of Byte): string;
var
i: integer;
begin
result:='';
for i:= Low(aArray) to High(aArray) do
begin
result:= result + ByteToHex(aArray[i]);
end;
Result:= IntToStr(StrToInt('$'+result));
end;
begin
buf[0] := $01;
buf[1] := $02;
showmessage(BinArrayToString(buf));
bus[0] := $00;
bus[1] := $01;
bus[2] := $02;
bus[3] := $03;
showmessage(BinArrayToString(bus));
end;

5,913

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧