如何在Delphi7中将十六进制数据转换为字节
我有一个问题,那就是如何在Delphi7中将十六进制文件转换为字节。我有十六进制数据:$0183,我想把它转换成字节,但当我把它转换成字节时,数据变为131。我希望数据保持为0183,因为我希望将此值与另一个十六进制数据$0001合并。我编写的源代码如下:如何在Delphi7中将十六进制数据转换为字节,delphi,hex,byte,delphi-7,Delphi,Hex,Byte,Delphi 7,我有一个问题,那就是如何在Delphi7中将十六进制文件转换为字节。我有十六进制数据:$0183,我想把它转换成字节,但当我把它转换成字节时,数据变为131。我希望数据保持为0183,因为我希望将此值与另一个十六进制数据$0001合并。我编写的源代码如下: procedure TForm1.dxBarButton9Click(Sender: TObject); var h: array [1..12]of string; EA2: String; EA1: word; begin h[1]:='
procedure TForm1.dxBarButton9Click(Sender: TObject);
var
h: array [1..12]of string;
EA2: String;
EA1: word;
begin
h[1]:='01';
h[2]:='83';
EA2:='$'+copy(h[1],1,2)+copy(h[2],1,2);
Edit1.Text:=(EA2);
EA1:= StrtoInt(EA2);
EA1:= EA1 and $0001;
Edit2.Text:=IntToStr(EA1);
end;
我的问题是,数据h[1]和h[2]实际上是我从串行通信中收到的数据,它是十六进制文件。我只是把代码写在这里,让它变得简单。在得到h[1]&h[2]之后,我需要将这些数据合并为EA1=0183。然后我想用$0001(整数)进行“和”运算。我怎么能做到?
我感谢你的帮助。非常感谢
EA1
字节是所需值的低位字节,它是83hex=131dec
%x
说明符的格式
编辑
您有一个包含值65的字节(例如)。它可能显示为十进制65、十六进制$41、二进制01000001、Ansi字符“A”。但它仍然是一组相同的1和0
当您将字符串值“$0183”转换为Word(再次注意:字节不够)时,您将得到Word值387十进制,与十六进制$0183相同。如果我理解正确的话,你可以用var这个词进行二进制和运算。
procedure TForm1.Button3Click(Sender: TObject);
var
EA1: word;
begin
EA1 := StrToInt('$0183') and $0001; // $0183 and $0001
// or
EA1 := StrToInt('$'+IntToHex(0183, 4)) and $0001; // 183 and $0001
Caption := IntToStr(EA1);
Caption := '$'+IntToHex(EA1,4);
end;
如何在DelphiIDE中查看十六进制格式的值
要在Delphi IDE中查看十六进制形式的值,请在计算器(Ctrl+F7)或Watches(Ctrl+Alt+W)中的变量名后添加“、h”(不带引号)。默认情况下,Delphi以十进制形式显示值,您必须在值后添加“、h”才能看到十六进制形式的值
如何在运行时将字符串值从十六进制形式转换为整数
不要创建字符串数组,只需将所有十六进制数字累加到一个字符串中,然后将整个字符串转换为整数值。只需使用以下函数,ValHex
var
s: String;
i: Cardinal;
begin
s := '183';
if ValHex(s, i) then // pass pure hexadecimal characters only, without a '$' prefix.
begin
// now i has value of $0183
end;
end;
这是ValHex的代码。它只接受纯十六进制字符,没有“$”前缀
function ValHex(const s: string; var AOut: Cardinal): Boolean;
var
a, i, L, start: Cardinal;
c: Char;
begin
Result := False;
AOut := 0;
L := Length(s);
start := 0;
if (L = 0) then Exit;
while (start < L-1) and (s[start+1] = '0') do Inc(start); // skipping leading zeros
if (L-start > 8) then Exit; // checking for overflow
a := 0;
for i := 1+start to L do
begin
C := s[i];
a := a shl 4;
case C of
'0'..'9' : Inc(a, Ord(C) - Ord('0'));
'A'..'F' : Inc(a, Ord(C) - Ord('A') + 10);
'a'..'f' : Inc(a, Ord(C) - Ord('a') + 10);
else Exit;
end;
end;
AOut := a;
Result := True;
end;
您还可以使用Delphi函数Format()将整数转换为十六进制字符串,请参阅文档。实际上,我只希望h[1]&h[2]上具有数据类型字符串的十六进制值可以变成$0183(具有数据类型整数),这样我就可以使用$0001(其中$0001具有整数数据类型)执行“和”。你知道吗?我的答案仍然有效。这是您在本主题中的第三个问题,任务理解方面没有进展。在解决实际问题之前,您肯定应该先学习编程的基础知识。您好,Mbo,首先,是的,我只是在几个月内使用delphi进行编程,所以需要了解更多,正如您建议使用%x,正如我在delphi中所知,我可以使用格式('%x',[387]),然后我将得到十六进制的0183,但仍然是字符串格式的&我仍然不能使用“and”活动因为“和”运算需要在整数中进行。请重读我的第二段。请注意,我用ByteBuf做的例子更适合于数据处理。嗨,Mbo,也许我太笨了,无法理解你试图解释的内容。很抱歉。您好,电子计算机,现在我没有把它存储在单字节中,我已经将它转换成了0183字节,但是我仍然有一个问题,如何使用$0001执行“和”操作?因为现在0183不再是十六进制文件,所以我需要在0183前面添加$0183。然后我可以用0001美元“和”。你有什么想法吗?那么,如果你需要在0183前面添加$front,为什么不在0183前面添加$呢:)声明
EA1
为word
,Cardinal
或Integer
,Byte
对于大于255的值来说太小了。Hi-Lu-RD,是的,我已经将它声明为word,现在我已经完成了0183。但因为现在0183不再是十六进制文件,所以我需要在0183前面添加$0183。然后我可以用0001美元做“和”运算。您知道如何在0183前面添加$吗?这完全是一种混乱。您的代码就是这样做的。这完全是浪费时间。这就是或strotint
所做的:TryStrToInt支持以下十六进制符号的字符串:Delphi:$1234和0x1234。因此,stroint(“$0183”)
以十进制表示法给出值387。嗨,Maxim,我尝试过你的代码,但当我运行时,它给出的值“I”变成387。它与stroint($0183)完全相同。我想要的是“$0183”(字符串)变成$183(整数),所以下一步我可以做$183和$0001。这就是我的目的。谢谢。当使用计算器查看“I”的值时,不要键入“I”,键入“I,h”(不带引号),因此您将看到$183,而不是387。无论您如何查看变量的值,您都可以使用I、like and或XOR等进行逻辑运算。
function Hex8(A: Cardinal): string;
const
HexCharArr: array [0..15] of Char = '0123456789ABCDEF';
var
I: Integer;
begin
SetLength(Result, 8);
for I := 0 to 7 do
begin
Result[8 - I] := HexCharArrW[(A and $F)];
A := A shr 4;
end;
end;