Форум: "Основная";
Текущий архив: 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]
> al1var
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