Hex в string і навпаки

Hex в String і навпаки

Майстри підкажіть будь ласка як з Hex переводити в String і навпаки. Є у мене наприклад якась сукупність електронних даних: Buf: array of Byte

мені треба етот Buf перевести в рядок, содержашийся його HEX формат
s. string. де довжина рядка вийти рівною довжині Buf * 2 і назад!

Може є якісь компоненти, з допомогою яких можна було б легко оперувати з HEX?

Див функцію format ()


> Pat

І як мені з нею працювати? помоему format не буде вирішенням [0]

Al1 # XA0; (21.11.04 18:35) # XA0;
Немає необхідності, Hex вже String, відповідно і навпаки.
Але в самій темі чому то вже говориш про байти.


> [2] al1 # XA0; (21.11.04 18:56)

А працювати так: Format ( "% x", [IntegerValue]).


> Майстра підкажіть будь ласка як з Hex переводити в String
> І навпаки.

1.) З HEX в String (вірніше з integer, byte і інших цілочисельних типів в string в HEX форматі)
# XA0; a) function IntToHex (Value: Integer; Digits: Integer): string;
# XA0; b) format (вже в предідущіх постах пояснили)

2.) Зворотно
# XA0; function StrToInt (const S: string): Integer;

приклад: # XA0; MyInteger: = StrToInt ( "$" + MyString);

де довжина рядка вийти рівною довжині Buf * 2 і назад

Ага, здається, я зрозумів. Кожен байт потрібно представити у вигляді двох шістнадцяткових цифр. Тоді можна так:

Я не маю рації, що не
IntToHex (Buf [i])
а як написав SergP
IntToHex (Buf [i], 2)
Хоча тут теж проблема з ведучим нулем. Напевно без Format тут не обійтися, хоча особисто я написав би безпосередньо перетворення

немає мені треба трохи інше:
є у мене Buf: array of Byte, в якому мається 6 байт: 6D6F757365 а мені треба наприклад в s: String отримати з етого слово mouse і в SHex: string отримати "6D6F757365". (И у мене вийти довжиною в 5 символів а SHex довжиною в 10 символів)

Тобто мені треба знати як мені можна конвертувати з Buf в String і в StringinHex і навпаки!


> [9] al1 # XA0; (21.11.04 19:29)

Чогось у тебе не так в консерваторії, де там 6 байт, я тільки 5 бачу.


> [9] al1 # XA0; (21.11.04 19:29)

Ну а взагалі обробляй рядок в циклі, по 2 символу, кожен шматочок переводи в Byte за допомогою StrToInt, а потім можна отримати символ, що відповідає цьому коду, за допомогою Chr ().

чого ви до хлопця пристали? просто скажіть відповідь і все :)

var
# XA0; Buf: array of Byte;
# XA0; S, SHex: String;
# XA0; I: Integer;

begin
# XA0; S: = "";
# XA0; SHex: = "";
# XA0; for I: = Low (Buf) to High (Buf) do
# XA0; begin
# XA0; # XA0; S: = S + Chr (Buf [I]);
# XA0; # XA0; SHex: = SHex + Format ( "% x", [Buf [I]])
# XA0; end
end.

Щось типу цього, чтоли?

function HerZnaetChtoToString (var MyBuf: TMyArray): string;
var
# XA0; i: integer;
begin
# XA0; setlength (result, High (MyBuf) -Low (MyBuf) +1);
# XA0; for i: = low (MyBuf) to High (MyBuf) do
# XA0; result [i-low (MyBuf) +1]: = chr (MyBuf [i]);
end;

У роботі не пробував. Міг і помилитися де-нить.

У IntToHex немає проблеми з ведучим нулем.

Дякуємо.

> Begin. end

А можеш ще підказати кодом на зворотний процес?
(З String в Buf)


> [21] al1 # XA0; (21.11.04 21:06)


> А можеш ще підказати кодом на зворотний процес?
> (З String в Buf)

З якого String - з S або SHex?

Якщо ти маєш на увазі SHex, то тоді можна так:

var
# XA0; Buf: array of Byte;
# XA0; SHex: String;
# XA0; I, Len: Integer;

Працює, але щодо оптимальності - не знаю. Хочу спати, міркую погано.

P.S. Люблю Балтику 7.

Дякуємо. Начебто працює!
Таке питання:
while (I <= High(Buf)) do

а як виставити відразу потрібний розмір Buf?


> [24] al1 # XA0; (21.11.04 21:42)


> А як виставити відразу потрібний розмір Buf?

Потрібний розмір Buf виставляється в рядку: "SetLength (Buf, Len div 2);".

P.S. Можна навіть Балтику 3.

Цикл while можна і на for замінити, тобто замість цього:


> Мда. Не бачити мені пива. - (

Хіба що по пошті! Країна? Місто. -)

Ні, не бачити. Навряд чи він настолко товсті тонкі натяки розуміє :) Він себе то зрозуміти не може.


> Він себе то зрозуміти не може.

Я ще не до такої міри напився щоб себе не розуміти. -)

А от щодо конвертації Hex в рядок і навпаки - перерив купу документації. всюди в ковзає ето обьясняеться. толком без прикладів. і мало чого зрозуміло :-( Може хтось підкаже де мені про ето все гарненько почитати? Буду вдячний. -)


> [30] al1 # XA0; (21.11.04 22:17)

Тепер всі поради тільки після повної передоплати :-)

16-ти розрядний уявлення даних.
Діапазон від 0х00 до 0хFF
(Якщо в int, то від 0 до 255)

По-перше ніяке це не 16-ти розрядне представлення даних. Це уявлення числа в 16-річної системі числення. 16-ти розрядний уявлення це коли цифра 3 записується в 16 розрядах чого небудь. наприклад
0000000000000003
або
0000000000000101

Ключовий момент "уявлення". Представляти може тільки людина. Для стандартного процесора це виглядає як "є, немає". Йому до фені якийсь там 16-ти розрядне подання, подання в 16-тірічной системі числення. Вас в школі не вчили як переводити з однієї системи числення в іншу хіба?


> Вас в школі не вчили як переводити з однієї системи числення
> В іншу хіба?

Ще як вчили! Наздогнали і ще раз навчили. -)


> Наприклад
> 0000000000000003
> або
> 0000000000000101

Це двійкове подання даних. -)
3 в integer - ето 0х03 в Hex

це я тобі показав, що таке 16-ти розрядність, і перше представоеніе це не двійкове подання. це сколькоугодноічное (більше трьох). але обидва цих уявлення 16-тіразрядние

а що таке integer, можеш мені сказати?


> А що таке integer, можеш мені сказати?

Звичайно можу:
Цілочисельний тип integer. Діапазон -2147483648..2147483647. Змінна типу Integer займає в пам'яті 4 байта (32 біта). Її бітовий формат: найстарший біт - знак числа, інші біти (31 штука) - саме число.

Саме так. Integer - це тип. описує змінну, а Hex - це уявлення показує змінну. Між ними немає ніякого зв'язку. Тепер що таке String?


> Тепер що таке String?

тип, що описує строкову змінну

Ув. майстри, підкиньте будь ласка пару посилань на доки де про ето можна прочитати гарненько! Теж цікаво розібратися!
Дякуємо.

Що ви страждаєте.
Є ж чудові функції в Delphi - BinToHex і HexToBin.
Все чудово працює.


> Є ж чудові функції в Delphi - BinToHex і HexToBin.

Мені треба рядок в Hex а не BinToHex

Ще раз Хекса вже рядок

var buf. array of byte;
# XA0; # XA0; s. string;
Buf: = s ;.

Уже перевів, але тільки рядок в масив байтів, якщо звичайно компілятор облає.

Добре а як дізнатися по символу його код?
(Зворотний процес ф-ції Chr)


> [46] Al1 # XA0; (22.11.04 16:21)

> Добре а як дізнатися по символу його код?

Ord ()

Шановні майстри, на кшталт вийшов у мене какойто результат:

type ArrayOfByte = array of byte;

function Hex2StrHex (Buf. array of byte; BufLength. integer): String;
var i. integer;
begin
Result: = "";
for I: = 1 to BufLength do
begin
# XA0; Result: = Result + Format ( "% x", [Buf [I]])
end;
end;

function Hex2Str (Buf. array of byte; BufLength. integer): String;
var i. integer;
begin
Result: = "";
for I: = 1 to BufLength do
begin
# XA0; Result: = Result + Chr (Buf [I]);
end;
end;

function StrHex2Hex (SHex. string; SHexLength. integer): ArrayOfByte;
var
I: Integer;

function Str2Hex (S. string; SLength. integer): ArrayOfByte;
var
I: Integer;

begin
if (SLength> 0) then
begin
# XA0; SetLength (Result, SLength);
# XA0; for I: = 0 to High (Result) do
# XA0; Result [I]: = Ord (S [i + 1]);
end;
end;

Перевірте будь ласка, може щось не так?

І ще питаннячко: а як оголосити function (): array of byte, що не оголошено новий тип: type ArrayOfByte = array of byte.


> [48] Al1 # XA0; (22.11.04 17:13)

А навіщо в функції передавати довжини масивів і рядків, коли їх (довжини) можна визначати всередині функцій?

на випадок універсальності. раптом забудеш вкоротити рядок, після роботи з нею. або в буфері допустимо тобі треба буде з'їсти і обробити шматок а не весь. -)


> [50] Al1 # XA0; (22.11.04 17:28)

Зате можна щось переплутати і передати, наприклад, число, більше, ніж взагалі можливо. А це вже буде вихід за межі.

> [48] Al1 # XA0; (22.11.04 17:13)


> Function Hex2StrHex (Buf. Array of byte; BufLength. Integer): String;

> For I: = 1 to BufLength do

Помилка. Buf: array of Byte - це ВІДКРИТИЙ масив. Для них, як і для динамічних, нумерація елементів починається з нуля. Тут, ІМХО, краще замінити array of byte на вже оголошений тобою тип - динамічний масив - ArrayOfByte. Але нижній індекс все одно буде дорівнює нулю, так що раджу тут замість 1 і BufLength використовувати Low (Buf) і High (Buf).

Пам'ять: 0.83 MB
Час: 0.079 c

Схожі статті