我有TBytes变量,值为[0,0,15,15]。如何将其转换为“00FF”?
我不想使用循环,bcoz这个逻辑用于时间密集型功能。
(我尝试使用BinToHex,但我无法使用字符串变量。)
谢谢&的问候,
帕。
答案 0 :(得分:5)
// 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,所以只需要一个十六进制数字。如果您的示例是拼写错误,那么只需用这一行替换最后两行:
Result := IntToHex(Swap32(IntBytes^), 8);
顺便说一句,你的禁止循环的要求将无法满足。 IntToHex
在内部使用循环。
答案 1 :(得分:3)
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".
答案 2 :(得分:2)
这个版本速度非常快,适用于任何数组大小。它就像BinToHex,但不是期望0..255字节值,而是仅使用低半字节。
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;
执行相同操作的汇编程序:
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;
用法:
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 :(得分:0)
派对迟到但为什么不是一个简单的查找表?
const
HexChars : Array[0..15] of Char = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
假设TBytes值为0..15
Function (ABytea: TBytes): string
begin
Result := HexChars[ABytea[0]];
Result := Result + HexChars[ABytea[1]];
Result := Result + HexChars[ABytea[2]];
Result := Result + HexChars[ABytea[3]];
end;
当然更整洁了一个循环:)并且需要修改15以上的字节值:
begin
Result := HexChars[ABytea[0] shr 4];
Result := Result + HexChars[ABytea[0] and $0F];
Result := Result + HexChars[ABytea[1] shr 4];
Result := Result + HexChars[ABytea[1] and $0F];
Result := Result + HexChars[ABytea[2] shr 4];
Result := Result + HexChars[ABytea[2] and $0F];
Result := Result + HexChars[ABytea[3] shr 4];
Result := Result + HexChars[ABytea[3] and $0F];
end;
如果TBytes变大,特别是循环更整洁