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

如何在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]:='

我有一个问题,那就是如何在Delphi7中将十六进制文件转换为字节。我有十六进制数据:$0183,我想把它转换成字节,但当我把它转换成字节时,数据变为131。我希望数据保持为0183,因为我希望将此值与另一个十六进制数据$0001合并。我编写的源代码如下:

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,因为此值需要一个字或两个字节

  • 您似乎混淆了字节和人眼的表示形式——十进制、十六进制、二进制或其他形式。例如,您的
    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;