如何将十六进制数据转换为字节在Delphi7
我有一个问题,就是如何将十六进制文件转换为字节在Delphi 7中。我有十六进制数据:$ 0183,我想将其转换为字节,但是当我转换它时到字节的数据变成了131.我希望数据保持它0183,因为我想和这个值与另一个十六进制数据$ 0001。我有写如下的源代码:如何将十六进制数据转换为字节在Delphi7
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(整数)做“和”操作。我该怎么做? 我感谢您的帮助。非常感谢。
不能存储$ 0183的单字节,因为该值要求Word或两个字节
看来你迷惑字节值其表示人眼 - 十进制,十六进制,二进制或其他形式。例如,你的
EA1
字节为需要的值的低字节,它是83hex=131dec
要看看十六进制值,使用格式与%x
符
编辑
你有一个字节包含值65(例如)。它可能显示为十进制65,如十六进制$ 41,作为二进制01000001,作为Ansi字符'A'。但它仍然是一组零和零。
当您将字符串值'$ 0183'转换为Word(再次注意:字节不够)时,您将得到字数值387的十进制数,与十六进制数$ 0183相同。你可以使用Word var进行二进制与运算。
其实我只是希望h [1]&h [2](它有数据类型字符串)上的十六进制值可能变成$ 0183(它具有数据类型整数),以便我可以用$ 0001($ 0001是$数据类型)。你有什么主意吗? –
我的答案仍然有效。这是你在这个主题中的第三个问题,在任务理解方面没有任何进展。在解决问题之前,你绝对应该学习编程的基础知识。 – MBo
嗨Mbo,首先,是的,我只是在几个月内使用delphi进行编程,所以需要了解更多信息,以及您使用%x的建议,正如我在delphi中所了解的,我可以使用format('%x',[387]) ,那么我将在十六进制中得到0183,但仍然会以字符串格式&我仍然不能执行“和”操作。因为“和”操作需要整数。 –
如果我理解正确
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;
嗨Ercument,现在我已经把它存储不单独的字节,我已经完全转换成字节成为0183,但我仍然有一个问题如何做“和”与$ 0001操作?因为现在0183不再是十六进制文件,所以我需要在$ 0183前面添加$成为$ 0183。然后我可以“和”与$ 0001。你有什么主意吗? –
所以,如果你需要添加$ 0183的前端,为什么不加$ $到0183的前面:) –
回答编辑。你在寻找IntToHex吗? –
如何看待在Delphi IDE以十六进制形式值
要查看在Delphi的IDE十六进制形式的值,加“H”(不带引号)在评估器(Ctrl + F7)或手表(Ctrl + Alt + W)中输入变量名称后。默认情况下,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标准功能StrToInt(),请参阅如何使用它的文件 - 您应该添加“$”前缀的十六进制值,否则将把参数为十进制值。
如何整数值转换为十六进制字符串在运行时
function Hex8(A: Cardinal): string;
const
HexCharArr: array [0..15] of Char = 'ABCDEF';
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;
您还可以使用Delphi函数格式()将整数转换为十六进制字符串,请参阅文档。
这是什么[SysUtils.TryStrToInt](http://docwiki.embarcadero.com/Libraries/en/System.SysUtils.TryStrToInt)或'StrToInt'确实:* TryStrToInt支持以下十六进制表示法中的字符串: Delphi:$ 1234和0x1234。*因此'StrToInt('$ 0183')'以十进制表示法给出值387。 –
嗨马克西姆,我已经尝试了你的代码,但是当我运行它给出的值“我”变成了387.它和StrToInt($ 0183)一样,我想要的是'$ 0183'(字符串)变成$ 183(整数),所以在下一步我可以做$ 183和$ 0001。这是我的目的。非常感谢 –
当使用评估者查看“我”的值时,不要键入“我”,输入“我,h”(不含引号),所以你会看到183美元,而不是387.无论你如何看待价值的变量,你可以对我进行逻辑运算,比如AND,OR,XOR等。 –
声明'EA1'为'word','Cardinal'或'Integer'.'Byte'对于大于255的值来说太小了。 –
Hi Lu RD,是的我已经声明它是单词,现在我已经完成得到0183.但是因为现在0183不再是十六进制文件,所以我需要在$ 0183前面添加$变成$ 0183。然后我可以用$ 0001做“和”操作。你有什么想法如何在0183前添加$? –
这是完全困惑。 –