我有一个问题是如何在Delphi 7中将Hex文件转换为字节。我有Hex数据:$ 0183,我想将其转换为byte,但是当我将其转换为byte时,数据更改为131。我希望数据保持0183因为我想和另一个十六进制数据$ 0001这个值。我编写了如下源代码:
-------start--------
from here..............
aVar=Sample
我的问题是,数据h [1]& h [2]实际上是我从串行通信收到的数据是hex文件。我只是把它写在这里的代码,只是为了简单。在我得到h [1]& h [2]之后,我需要将这些数据组合成EA1 = 0183。然后我想用$ 0001(整数)做“和”操作。我怎么能这样做? 我感谢您的帮助。非常感谢。
答案 0 :(得分:1)
您不能在单个字节中存储$ 0183,因为此值需要Word或两个字节
您似乎将字节值与人眼的表示混淆 - 十进制,十六进制,二进制或其他形式。例如,您的EA1
字节是所需值的低字节,它是83hex=131dec
要以十六进制查看值,请使用带%x
说明符的格式
修改强>
您有一个包含值65的字节(例如)。它可能显示为十进制65,十六进制为$ 41,二进制01000001,为Ansi char'A'。但它仍然是同一组的零和零。
当你将字符串值'$ 0183'转换为Word(再次注意:字节是不够的)时,你会得到387十进制字值,它与十六进制$ 0183 相同。并且您可以使用Word var。
进行二进制AND操作答案 1 :(得分:-1)
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 = '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;
您也可以使用Delphi函数Format()将整数转换为十六进制字符串,请参阅文档。