首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Delphi中将字节数组转换为十六进制表示

如何在Delphi中将字节数组转换为十六进制表示
EN

Stack Overflow用户
提问于 2009-06-29 20:25:09
回答 4查看 21.7K关注 0票数 1

我有一个值为0,0,15,15的TBytes变量。如何将其转换为"00FF“?

我不想使用循环,因为这个逻辑要用在时间密集型函数中。

(我尝试使用BinToHex,但无法使用字符串变量。)

感谢和问候,

帕万。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-06-29 20:47:22

代码语言:javascript
复制
// Swapping is necessary because x86 is little-endian.
function Swap32(value: Integer): Integer;
asm
  bswap eax
end;

function FourBytesToHex(const bytes: TBytes): string;
var
  IntBytes: PInteger;
  FullResult: string;
begin
  Assert(Length(bytes) = SizeOf(IntBytes^));
  IntBytes := PInteger(bytes);
  FullResult := IntToHex(Swap32(IntBytes^), 8);
  Result := FullResult[2] + FullResult[4] + FullResult[6] + FullResult[8];
end;

如果最后一行看起来有点奇怪,那是因为您请求将一个四字节数组转换为一个四字符串,而在一般情况下,需要八个十六进制数字来表示一个四字节值。我只是假设您的字节值都小于16,所以只需要一个十六进制数字。如果您的示例是一个拼写错误,则只需将最后两行替换为下面的一行:

代码语言:javascript
复制
Result := IntToHex(Swap32(IntBytes^), 8);

顺便说一下,您禁止循环的要求将不会得到满足。IntToHex在内部使用循环。

票数 5
EN

Stack Overflow用户

发布于 2009-06-29 20:27:56

代码语言:javascript
复制
function ByteToHex(InByte:byte):shortstring;
const Digits:array[0..15] of char='0123456789ABCDEF';
begin
 result:=digits[InByte shr 4]+digits[InByte and $0F];
end;

Example :
MyHex := ByteTohex($FF);
the result
MyHex is "FF".

MyHex := ByteTohex(255);
the result
MyHex is "FF".

MyHex := ByteTohex($55);
the result
MyHex is "55".
票数 3
EN

Stack Overflow用户

发布于 2009-06-29 21:21:42

这个方法非常快,可以处理任何大小的数组。它类似于BinToHex,但它只使用低位半字节,而不是0..255字节值。

代码语言:javascript
复制
procedure BinToSingleHex(Buffer, Text: PAnsiChar; BufSize: Integer);
const
  Convert: array[0..15] of AnsiChar = '0123456789ABCDEF';
var
  I: Integer;
begin
  for I := 0 to BufSize - 1 do
  begin
    Text[0] := Convert[Byte(Buffer[I]) and $F];
    Inc(Text);
  end;
end;

做同样事情的汇编程序:

代码语言:javascript
复制
procedure BinToSingleHex(Buffer, Text: PAnsiChar; BufSize: Integer);assembler;
asm
        PUSH    ESI
        PUSH    EDI
        MOV     ESI,EAX
        MOV     EDI,EDX
        MOV     EDX,0
        JMP     @@1
@@0:    DB      '0123456789ABCDEF'
@@1:    LODSB
        AND     DL,AL
        AND     DL,0FH
        MOV     AL,@@0.Byte[EDX]
        STOSB
        DEC     ECX
        JNE     @@1
        POP     EDI
        POP     ESI
end;

用法:

代码语言:javascript
复制
type  THexDigit=0..15;
const ArSize=16;
var   Ar:array[0..Pred(ArSize)] of THexDigit=(0,1,2,3,4,5,6,7,8,9,8,7,6,5,4,3);
      S:Array[0..Pred(ArSize)] of AnsiChar;

BinToSingleHex(@Ar,S,Length(Ar));
WriteLn(S);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1060321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档