2016-12-04 197 views
-2

我有一个问题,就是如何将十六进制文件转换为字节在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(整数)做“和”操作。我该怎么做? 我感谢您的帮助。非常感谢。

+0

声明'EA1'为'word','Cardinal'或'Integer'.'Byte'对于大于255的值来说太小了。 –

+0

Hi Lu RD,是的我已经声明它是单词,现在我已经完成得到0183.但是因为现在0183不再是十六进制文件,所以我需要在$ 0183前面添加$变成$ 0183。然后我可以用$ 0001做“和”操作。你有什么想法如何在0183前添加$? –

+3

这是完全困惑。 –

回答

1
  1. 不能存储$ 0183的单字节,因为该值要求Word或两个字节

  2. 看来你迷惑字节表示人眼 - 十进制,十六进制,二进制或其他形式。例如,你的EA1字节为需要的值的低字节,它是83hex=131dec

要看看十六进制值,使用格式与%x

编辑

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

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

+0

其实我只是希望h [1]&h [2](它有数据类型字符串)上的十六进制值可能变成$ 0183(它具有数据类型整数),以便我可以用$ 0001($ 0001是$数据类型)。你有什么主意吗? –

+2

我的答案仍然有效。这是你在这个主题中的第三个问题,在任务理解方面没有任何进展。在解决问题之前,你绝对应该学习编程的基础知识。 – MBo

+0

嗨Mbo,首先,是的,我只是在几个月内使用delphi进行编程,所以需要了解更多信息,以及您使用%x的建议,正如我在delphi中所了解的,我可以使用format('%x',[387]) ,那么我将在十六进制中得到0183,但仍然会以字符串格式&我仍然不能执行“和”操作。因为“和”操作需要整数。 –

-1

如果我理解正确

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; 
+0

嗨Ercument,现在我已经把它存储不单独的字节,我已经完全转换成字节成为0183,但我仍然有一个问题如何做“和”与$ 0001操作?因为现在0183不再是十六进制文件,所以我需要在$ 0183前面添加$成为$ 0183。然后我可以“和”与$ 0001。你有什么主意吗? –

+0

所以,如果你需要添加$ 0183的前端,为什么不加$ $到0183的前面:) –

+0

回答编辑。你在寻找IntToHex吗? –

-1

如何看待在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函数格式()将整数转换为十六进制字符串,请参阅文档。

+1

这是什么[SysUtils.TryStrToInt](http://docwiki.embarcadero.com/Libraries/en/System.SysUtils.TryStrToInt)或'StrToInt'确实:* TryStrToInt支持以下十六进制表示法中的字符串: Delphi:$ 1234和0x1234。*因此'StrToInt('$ 0183')'以十进制表示法给出值387。 –

+0

嗨马克西姆,我已经尝试了你的代码,但是当我运行它给出的值“我”变成了387.它和StrToInt($ 0183)一样,我想要的是'$ 0183'(字符串)变成$ 183(整数),所以在下一步我可以做$ 183和$ 0001。这是我的目的。非常感谢 –

+0

当使用评估者查看“我”的值时,不要键入“我”,输入“我,h”(不含引号),所以你会看到183美元​​,而不是387.无论你如何看待价值的变量,你可以对我进行逻辑运算,比如AND,OR,XOR等。 –

相关问题