如何在Delphi7中将十六进制数据转换为字节

时间:2016-12-04 09:15:18

标签: delphi hex byte delphi-7

我有一个问题是如何在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(整数)做“和”操作。我怎么能这样做? 我感谢您的帮助。非常感谢。

2 个答案:

答案 0 :(得分:1)

  1. 您不能在单个字节中存储$ 0183,因为此值需要Word或两个字节

  2. 您似乎将字节与人眼的表示混淆 - 十进制,十六进制,二进制或其他形式。例如,您的EA1字节是所需值的低字节,它是83hex=131dec

  3. 要以十六进制查看值,请使用带%x说明符的格式

    修改

    您有一个包含值65的字节(例如)。它可能显示为十进制65,十六进制为$ 41,二进制01000001,为Ansi char'A'。但它仍然是同一组的零和零。

    当你将字符串值'$ 0183'转换为Word(再次注意:字节是不够的)时,你会得到387十进制字值,它与十六进制$ 0183 相同。并且您可以使用Word var。

    进行二进制AND操作

答案 1 :(得分:-1)

如何在Delphi IDE中以十六进制格式查看值

要在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标准函数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()将整数转换为十六进制字符串,请参阅文档。