Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Вниз

Hex в String и наоборот   Найти похожие ветки 

 
Al1   (2004-11-21 18:35) [0]

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

мне надо етот Buf перевести в строку, содержашую его HEX формат
s : string , где длина строки получиться равной длине Buf * 2 и обратно!

Может есть некие компоненты, с помошью которых можно было бы легко оперировать с HEX?


 
Pat ©   (2004-11-21 18:40) [1]

См функцию format()


 
al1   (2004-11-21 18:56) [2]


> Pat

И как мне с ней работать? помоему format не будет решением [0]


 
Anatoly Podgoretsky ©   (2004-11-21 19:08) [3]

Al1   (21.11.04 18:35)  
Нет необходимости, Hex уже String, соответственно и наоборот.
Но в самой теме почему то уже говоришь про байты.


 
begin...end ©   (2004-11-21 19:12) [4]


> [2] al1   (21.11.04 18:56)

А работать так: Format("%x", [IntegerValue]).


 
SergP ©   (2004-11-21 19:22) [5]


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


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

2.) Обратно
  function StrToInt(const S: string): Integer;

пример:   MyInteger:=StrToInt("$"+MyString);


 
palva ©   (2004-11-21 19:25) [6]

где длина строки получиться равной длине Buf * 2 и обратно

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

s := "";
for i := 0 to ...
begin
 s := s + IntToHex(Buf[i])
end


 
Anatoly Podgoretsky ©   (2004-11-21 19:27) [7]

palva ©   (21.11.04 19:25) [6]
Хоть бы не приводил ошибочного кода


 
palva ©   (2004-11-21 19:29) [8]

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


 
al1   (2004-11-21 19:29) [9]

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

Т.е мне надо знать как мне можно конвертировать из Buf в String и в StringinHex и наоборот!


 
begin...end ©   (2004-11-21 19:34) [10]


> [9] al1   (21.11.04 19:29)

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


 
begin...end ©   (2004-11-21 19:36) [11]


> [9] al1   (21.11.04 19:29)

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


 
KilkennyCat ©   (2004-11-21 19:36) [12]


> begin...end ©   (21.11.04 19:34) [10]


у него впереди 00 :)


 
al1   (2004-11-21 19:36) [13]


> begin...end ©   (21.11.04 19:34) [10]

опечатался:
Buf - 5 байт
и вместо ы я имел ввиду S:
(S у меня получиться длиной в 5 символов а SHex длиной в 10 символов)


 
begin...end ©   (2004-11-21 19:39) [14]


> [11] begin...end ©   (21.11.04 19:36)

Нет, это я не то сказал. У тебя же изначально есть массив, вот для каждого элемента вызывай функцию Chr(), получишь соответствующий символ; а также для каждого элемента вызывай IntToHex() или Format(), получишь шестнадцатеричное представление байта; ну и так для всех элементов.


 
Palladin ©   (2004-11-21 19:48) [15]

чего вы к парню пристали? просто скажите ответ и все :)


 
begin...end ©   (2004-11-21 20:23) [16]


> al1


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

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


 
SergP ©   (2004-11-21 20:30) [17]

Что-то типа этого, чтоли?

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

В работе не пробовал. Мог и ошибиться где-нить....


 
SergP ©   (2004-11-21 20:32) [18]

А... Ну да.. Про SHEX еще забыл... Но

> begin...end ©   (21.11.04 20:23) [16]

тебе уже раньше меня ответил...


 
Anatoly Podgoretsky ©   (2004-11-21 20:33) [19]

Palladin ©   (21.11.04 19:48) [15]
Мягкая завуалированая форма - код давай.


 
SergP ©   (2004-11-21 20:52) [20]


>palva ©   (21.11.04 19:29) [8][Ответить]
> Хотя тут тоже проблема с ведущим нулем.


В IntToHex нет проблемы с ведущим нулем.


 
al1   (2004-11-21 21:06) [21]

Спасибо.

> begin...end

А можешь еще подсказать кодом на обратный процесс?
(Из String в Buf)


 
begin...end ©   (2004-11-21 21:16) [22]


> [21] al1   (21.11.04 21:06)


> А можешь еще подсказать кодом на обратный процесс?
> (Из String в Buf)

Из какого String - из S или SHex?


 
begin...end ©   (2004-11-21 21:36) [23]


> al1


Если ты имеешь в виду SHex, то тогда можно так:

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

begin
 // SHex := "6D6F757365";
 Len := Length(SHex);
 if (Len > 0) and (Len mod 2 = 0) then
 begin
   SetLength(Buf, Len div 2);
   I := 0;
   while (I <= High(Buf)) do
   begin
     Buf[I] := StrToInt("$" + Copy(SHex, I * 2 + 1, 2));
     Inc(I)
   end
 end
end.


Работает, но насчёт оптимальности - не знаю... Хочу спать, соображаю плохо...

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


 
al1   (2004-11-21 21:42) [24]

Спасибо. Вроде бы работает!
Такой вопрос:
while (I <= High(Buf)) do

а как выставить сразу нужный размер Buf?


 
begin...end ©   (2004-11-21 21:46) [25]


> [24] al1   (21.11.04 21:42)


> а как выставить сразу нужный размер Buf?

Нужный размер Buf выставляется в строке: "SetLength(Buf, Len div 2);".

P.S. Можно даже Балтику 3.


 
begin...end ©   (2004-11-21 22:01) [26]


> al1


Цикл while можно и на for заменить, т.е. вместо этого:

I := 0;
while (I <= High(Buf)) do
begin
 Buf[I] := StrToInt("$" + Copy(SHex, I * 2 + 1, 2));
 Inc(I)
end


можно так:

for I := 0 to High(Buf) do
 Buf[I] := StrToInt("$" + Copy(SHex, I * 2 + 1, 2))


 
begin...end ©   (2004-11-21 22:10) [27]

Мда... Не видать мне пива... :-(


 
al1   (2004-11-21 22:12) [28]


> Мда... Не видать мне пива... :-(

Разве что по почте! Страна? Город? :-)


 
Palladin ©   (2004-11-21 22:12) [29]

Нет, не видать. Вряд ли он настолко толстые тонкие намеки понимает :) Он себя то понять не может...


 
al1   (2004-11-21 22:17) [30]


> Он себя то понять не может...

Я еще не до такой степени напился чтоб себя не понимать! :-)

А вот насчет конвертирования Hex в строку и наоборот - перерыл кучу документации... везде в скольз ето обьясняеться... толком без примеров... и мало чего понятно :-( Может кто-то подскажет где мне про ето все хорошенько почитать? Буду благодарен! :-)


 
begin...end ©   (2004-11-21 22:18) [31]


> [30] al1   (21.11.04 22:17)

Теперь все советы только после полной предоплаты :-)


 
Palladin ©   (2004-11-21 22:19) [32]

Ты сначала подумай, а что такое HEX?


 
al1   (2004-11-21 22:23) [33]


> Palladin ©   (21.11.04 22:19) [32]
> Ты сначала подумай, а что такое HEX?


16-ти разрядное представление данных.
Диапазон от 0х00 до 0хFF
(если в int, то от 0 до 255)


 
Palladin ©   (2004-11-21 22:30) [34]

Во-первых никакое это не 16-ти разрядное представленние данных. Это представления числа в 16-ричной системе исчисления. 16-ти разрядное представление это когда цифра 3 записывается в 16 разрядах чего либо. Например
0000000000000003
или
0000000000000101

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


 
al1   (2004-11-21 22:36) [35]


> Вас в школе не учили как переводить из одной системы исчисления
> в другую разве?

Еще как учили! Догнали и еще раз научили! :-)


> Например
> 0000000000000003
> или
> 0000000000000101

Это двоичное представление данных! :-)
3 в integer - ето 0х03 в Hex


 
Palladin ©   (2004-11-21 22:40) [36]

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

а что такое integer, можешь мне сказать?


 
al1   (2004-11-22 00:14) [37]


> а что такое integer, можешь мне сказать?

Конечно могу:
Целочисленый тип integer... Диапазон -2147483648..2147483647... Переменная типа Integer занимает в памяти 4 байта (32 бита) ... Ее битовый формат: самый старший бит - знак числа, остальные биты (31 штука) - само число.


 
Palladin ©   (2004-11-22 00:18) [38]

Вот именно. Integer - это тип, описывающий переменную, а Hex - это представление показывающее переменную. Между ними нет никакой связи. Теперь что такое String?


 
Ken   (2004-11-22 09:31) [39]


> Теперь что такое String?

тип, описывающий строковую переменную


 
Ken   (2004-11-22 09:46) [40]

Ув. мастера, подкиньте пожалуйста пару ссылок на доки где про ето можно прочитать хорошенько! Тоже интересно разобраться!
Спасибо.


 
Rutven ©   (2004-11-22 10:26) [41]

Что вы мучаетесь.
Есть же замечательные функции в Delphi - BinToHex и HexToBin.
Всё замечательно работает.


 
Al1   (2004-11-22 14:37) [42]


> Есть же замечательные функции в Delphi - BinToHex и HexToBin.

Мне надо строку в Hex а не BinToHex


 
Anatoly Podgoretsky ©   (2004-11-22 15:40) [43]

Еще раз ХЕКС уже строка


 
Al1   (2004-11-22 15:54) [44]


> Anatoly Podgoretsky ©   (22.11.04 15:40) [43]
> Еще раз ХЕКС уже строка


и?

var buf : array of byte;
   s : string;
Buf := s; ???

как перевести?


 
Anatoly Podgoretsky ©   (2004-11-22 16:01) [45]

Уже перевел, но только строку в массив байтов, если конечно компилятор не обругает.


 
Al1   (2004-11-22 16:21) [46]

Хорошо а как узнать по символу его код?
(обратный процесс ф-ции Chr)


 
begin...end ©   (2004-11-22 16:23) [47]


> [46] Al1   (22.11.04 16:21)

> Хорошо а как узнать по символу его код?

Ord()


 
Al1   (2004-11-22 17:13) [48]

Уважаемые мастера, вроде получился у меня какойто результат:

type ArrayOfByte = array of byte;

implementation

{$R *.dfm}

function Hex2StrHex (Buf : array of byte; BufLength : integer):String;
var i : integer;
begin
Result := "";
for I := 1 to BufLength do
begin
  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
  Result := Result + Chr(Buf[I]);
end;
end;

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

begin
if (SHexLength > 0) and (SHexLength mod 2 = 0) then
begin
  SetLength(Result, SHexLength div 2);
  for I := 0 to High(Result) do
  Result[I] := StrToInt("$" + Copy(SHex, I * 2 + 1, 2));
end;
end;

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

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


Проверьте пожалуйста, может чтото не так?

И еще вопросик: а как обьявить function (): array of byte, не обьявляя новый тип: type ArrayOfByte = array of byte ???

Заранее спасибо.


 
begin...end ©   (2004-11-22 17:22) [49]


> [48] Al1   (22.11.04 17:13)

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


 
Al1   (2004-11-22 17:28) [50]


> begin...end ©   (22.11.04 17:22) [49]
>
> > [48] Al1   (22.11.04 17:13)
>
> А зачем в функции передавать длины массивов и строк, когда
> их (длины) можно определять внутри функций?


на случай универсальности.... вдруг забудешь укоротить строчку, после работы с ней!... или в буфере допустим тебе надо будет скушать и обработать кусок а не весь!... :-)


 
begin...end ©   (2004-11-22 17:50) [51]


> [50] Al1   (22.11.04 17:28)

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

> [48] Al1   (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).


 
Al1   (2004-11-22 18:01) [52]


> begin...end ©   (22.11.04 17:50) [51]

Понятно! Буду иметь ввиду! Спасибо.



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.036 c
10-1069399394
Юрий
2003-11-21 10:23
2004.12.05
TCorbaConnection возвращает BAD_OPERATION


14-1100596602
wisekaa
2004-11-16 12:16
2004.12.05
Ищу информацию по времени рассчета


14-1100520707
syte_ser78
2004-11-15 15:11
2004.12.05
Как я провел выходные


4-1097695561
cerber1
2004-10-13 23:26
2004.12.05
Вызов неэкспортируемых функций


1-1101110443
AleX200411
2004-11-22 11:00
2004.12.05
Сравнение объектов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский