2014-12-29 2 views
0

Я хочу преобразовать string из integers в hexadecimal (и наоборот).Как преобразовать «строку» из целых чисел в «шестнадцатеричный» (и обратно)?

Я видел функции IntToHex, но он использует небольшое целое число.

Например, мне нужно, чтобы преобразовать номер:

999888777666555444 in hexadecimal 

, а затем наоборот:

hexadecimal number in 999888777666555444 
+0

Не могли бы вы немного рассказать о диапазоне, который вам нужен для поддержки? Int64 может конвертировать 16 шестнадцатеричных цифр или около 19 или 20 десятичных цифр. Если вам нужно выйти за рамки этого, вам нужно будет сделать свое собственное преобразование, которое использует значение с плавающей запятой для хранения десятичной части. – HeartWare

+0

Чтобы дать конкретный совет, нам нужно знать, какой тип данных вы используете. –

ответ

0

Если вам нужно конвертировать более чем 8-байт значения, вы можете представить ваш очень -long-integer как массив байтов, слов, слова или чего-то еще. В этом случае вам нужно просто преобразовать любой конкретный элемент и объединить результаты. Противоположно одно и то же (единственное, что вы должны помнить, это значение следует рассматривать как выравнивание по правому краю).

0

преобразования произвольного буфера длины в шестнадцатеричном:

function HexDump(const _Buffer; _Len: integer): string; 
type 
    PByte = ^Byte; 
var 
    i: integer; 
    p: PByte; 
begin 
    p := @_Buffer; 
    Result := ''; 
    for i := 0 to _Len - 1 do begin 
    Result := Result + Long2Hex2(p^); 
    Inc(p); 
    end; 
end; 

а также вспомогательные функции, используемые в этом:

const 
    /// <summary> 
    /// String containing all characters that can be used as digits 
    /// </summary> 
    DIGIT_CHARS: string = 'ABCDEFGHIJKlMNOPQRSTUVWXYZ'; 

function Long2Num(_l: ULong; _Base: Byte; _MinWidth: Integer = 1): string; 
var 
    m: Byte; 
begin 
    Result := ''; 
    while _l > 0 do begin 
    m := _l mod _Base; 
    _l := _l div _Base; 
    Result := DIGIT_CHARS[m + 1] + Result; 
    end; 
    while Length(Result) < _MinWidth do 
    Result := '0' + Result; 
end; 

function Long2Hex(_l: ULong): string; 
begin 
    Result := Long2Num(_l, 16); 
end; 

function Long2Hex2(_l: ULong): string; 
begin 
    Result := Long2Hex(_l); 
    if Length(Result) < 2 then 
    Result := '0' + Result; 
end; 

Эти функции являются частью моей dzlib.

Примечание: Это не генерирует шестнадцатеричные числа, как вы могли бы ожидать, например. если вы передаете целое к функции, как это:

var 
    IntValue: integer; 
begin 
    IntValue := $12345678; 
    s := HexDump(IntValue, SizeOf(IntValue)); 
end; 

Вы в конечном итоге с S = «78563412», потому что процессоры Intel хранить целые числа в маленьком формате с обратным порядком байтов.

К сожалению, наоборот, сложнее, поскольку в Delphi нет стандартного произвольного целочисленного типа длины. Однако есть некоторые реализации такого типа.

+1

. Обратите внимание, что это преобразует целочисленную переменную, переданную как «const _Buffer», как целое число BIG-endian, тогда как Delphi на процессорах Intel (т.е. Windows и MAC) использует LITTLE-endian целые числа. То есть. целочисленное значение 1024 ($ 00000400) будет выведено как 00040000 – HeartWare

+1

(Фактически, прохождение $ 12345678 вернет 78563412 в качестве выхода) – HeartWare

+0

Opps, вы - reight @HeartWare – dummzeuch

Смежные вопросы