Главная страница
    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]

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



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

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

Наверх





Память: 0.54 MB
Время: 0.034 c
14-1100776799
User_OKA
2004-11-18 14:19
2004.12.05
Нужна помощь с ActiveX


6-1096015185
RoMka
2004-09-24 12:39
2004.12.05
IP адрес машины, находящейся в другой рабочей группе?


1-1101061918
Dot
2004-11-21 21:31
2004.12.05
CRC


1-1101155381
Тёма
2004-11-22 23:29
2004.12.05
Печать в чужом окне


3-1099909336
Геннадий
2004-11-08 13:22
2004.12.05
ORACLE: можно ли добавить (insert) сразу несколько строк?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский