Bazaprogram.ru

Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Delphi array of byte to string

Delphi array of byte to string

Господа, есть такая структура, цель преобразовать значение TRawPkt -> Data в String:

PRawPkt = ^TRawPkt;
TRawPkt = record
Data: array[0..MAX_DATA_LEN — 1] of Byte;
Len: Word;
end;

var
pkt: TRawPkt;
fbu: String;
begin
fbu := pchar(pkt.Data);

На последней строке, не получается. По моей идее тут должен был помоч pchar, но видимо знания теории подкачивают, — не знаю что делать.


Шпиён ( 2006-07-03 21:03 ) [1]


begin. end © ( 2006-07-03 21:06 ) [2]


MBo © ( 2006-07-03 21:10 ) [3]

SetString(fbu, @pkt.Data, pkt.len);


slon2k ( 2006-07-03 21:12 ) [4]

Это первое, что в голову пришло, но в итоге, ерунда получается. Не полностью значение в стринге оказывается, так например у меня там оказалось только 2 первых из массива, а должно быть гораздо больше.


> fbu := pkt.Data

Ну это не стыковка массива и стринга.

[Pascal Error] . Incompatible types


Шпиён ( 2006-07-03 21:17 ) [5]


> MBo © (03.07.06 21:10) [3]


> slon2k (03.07.06 21:12) [4]

SetString(fbu, pchar(@pkt.Data), pkt.len);


> например у меня там оказалось только 2 первых из массива,
> а должно быть гораздо больше.

Проверь свой массив. Нолик не затесался после первых двух символов?


begin. end © ( 2006-07-03 21:20 ) [6]

> slon2k (03.07.06 21:12) [4]

> > fbu := pkt.Data
> Ну это не стыковка массива и стринга.

Сочувствую. У меня [2] работает, причём в той же версии Delphi, что и у Вас.

> > SetString(fbu, @pkt.Data, pkt.len);
> [Pascal Error] . Incompatible types

В общем случае — PChar(@pkt.Data). А в данном — достаточно убрать собачку.


slon2k ( 2006-07-03 21:29 ) [7]

Спасибо! Вроде такая штука заработала:
SetString(fbu, pchar(@pkt.Data), pkt.len);


Пусик © ( 2006-07-03 21:29 ) [8]


> Сочувствую. У меня [2] работает, причём в той же версии
> Delphi, что и у Вас.

Вряд ли. или просьба опции компилятора дать, при которых это работать будет.


begin. end © ( 2006-07-03 21:37 ) [9]

> Пусик © (03.07.06 21:29) [8]

Да, извиняюсь. Мой ответ относится к случаю array of Char, а у автора — of Byte.

Delphi array of byte to string

Опции темы

Joker07
Дата 12.11.2008, 20:25 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.6.2006

Репутация: нет
Всего: нет

Alexeis
Дата 12.11.2008, 21:14 (ссылка) | (нет голосов) Загрузка .

Амеба

Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Joker07
Дата 13.11.2008, 00:19 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.6.2006

Репутация: нет
Всего: нет

Цитата(Alexeis @ 12.11.2008, 21:14)
Скопировать Удобно при помощи функции Move

Опытный

Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 1
Всего: 11

Virtuals
Дата 13.11.2008, 06:19 (ссылка) | (голосов:2) Загрузка .
Цитата(Joker07 @ 13.11.2008, 00:19 )
Непонял. Это такая шутка или что. Причем тут функция Move?
Код
var
a:array[1..8] of Byte;
b:packed array[0..3] of Word;
s:ShortString;
procedure TForm1.Button1Click(Sender: TObject);
begin
setlength(s,8);
a[1]:=$45;
a[2]:=$46;
a[3]:=$47;
a[4]:=$48;
move(a,s[1],8);
Memo1.Lines.Add(s);
b[0]:=$4748;
b[1]:=$4546;
move(b,s[1],8);
Memo1.Lines.Add(s);
end;

Код
s:=inttohex(a[1],2)+inttohex(a[2],2)+inttohex(a[3],2)+inttohex(a[4],2);
Memo1.Lines.Add(s);

Это сообщение отредактировал(а) Virtuals — 13.11.2008, 06:22

Joker07
Дата 13.11.2008, 21:45 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.6.2006

Репутация: нет
Всего: нет

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

Google
Дата 4.4.2020, 02:11 (ссылка)

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »

[ Время генерации скрипта: 0.1219 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Delphi array of byte to string

2 type Name = array of Base type; // Динамический массив

3 Name : array of const; // Открытый различный массив
Name : Array type; // Открытый динамический массив

Описание
Ключевое слово Array обеспечивает одномерные и многомерные массивы данных.

Delphi имеет три основных типа массивов :

1. Статические массивы

Они определены установленными, неизменяемыми размерами. Они могут быть одномерными или многомерными — последний является массивом массивов (массивов и т.д). Размер и диапазон такого многомерного массива всегда даются для самого высокого, крайнего левого массива — родительского массива.

Размер каждого измерения определен двумя способами, которые могут быть свободно смешаны в многомерном массиве :

Index type, где Index целое число, обычно Byte или Word. Диапазон этого типа определяет диапазон измерения. Например, Byte дает дипазон 0..255.

Ordinal..Ordinal Альтернативно, диапазон каждого измерения может быть задан предписанными порядковыми значениями, типа 22..44.

2. Динамические массивы

Динамические массивы не имеют никакой предраспределенной памяти. Определяется только когда создан указатель. Размеры таких массивов должны быть установлены прежде, чем они будут использоваться. Например :

устанавливает размер одномерного массива dynArray в 5 элементов. При этом будет распределена память.

Все динамические массивы начинаются с индекса = 0.

Индивидуальные подмассивы многомерного динамического массива могут иметь различные измерения — они, конечно являются отдельными массивами. После одной такой операции SetLength, на элементы набора массива уже можно ссылаться, даже при том, что остальная часть массива неопределена.

3. Открытые массивы

И статические и динамические массивы можно передать подпрограммам как параметры. Если определение параметра массива не имеет никакого диапазона (то есть, динамический тип массива), то вы должны, как это ни парадоксально передавать статический массив как параметр. Такой массив упоминается как Открытый массив. Delphi передает длину как скрытый параметр для подпрограммы.

Открытый массив также может быть определен типом значения константы. Это называют Различным (Variant) открытым массивом — это, главным образом, используется для разрешения передачи подпрограмме переменного числа значений аргументов.

Для передачи Динамического массива ссылкой, массив и подпрограммное определение массива должны быть через определение типов массива. См. код для примера.

Примечания
Используйте Copy для копирования одного массива в другой. Но будьте осторожны — это копирует только первое, самое высокое измерение — новый массив будет все еще относиться к элементам подмассивов.
Похожие команды
Copy Создает копию части строки или части массива

High Возвращает самое высокое значение типа или переменной

Length Возвращает число элементов в массиве или строке

Low Возвращает самое низкое значение типа или переменной

SetLength Изменяет размер строки или размер динамического массива

Slice Создает часть массива с параметром «Открытый Массив»

Delphi array of byte to string

Массивы в Object Pascal во многом схожи с аналогичными типами данных в других языках программирования. Отличительная особенность массивов заключается в том, что все их компоненты суть данные одного типа (возможно, структурированного). Эти компоненты можно легко упорядочить и обеспечить доступ к любому из них простым указанием его порядкового номера, например:

digit = array [0..9] of Char;

matrix = array [byte] of Single;

Описание типа массива задается следующим образом:

Здесь — правильный идентификатор; array, of — зарезервированные слова <массив, из); — список из одного или нескольких индексных типов, разделенных запятыми; квадратные скобки, обрамляющие список, — требование синтаксиса;

— любой тип Object Pascal.

В качестве индексных типов в Object Pascal можно использовать любые порядковые типы, имеющие мощность не более 2 Гбайт (т. е. Кроме LongWord И Int64)

Определить переменную как массив можно и непосредственно при описании этой переменной, без предварительного описания типа массива, например:

a,b : array [1..10] of Real;

Обычно в качестве индексного типа используется тип-диапазон, в котором задаются границы изменения индексов. Так как тип , идущий в описании массива за словом of, — любой тип Object Pascal, то он может быть, в частности, и другим массивом, например:

mat = array [0..5] of array [-2..2] of array [Char] of Byte;

Такую запись можно заменить более компактной:

mat = array [0..5,-2..2,char] of Byte;

Глубина вложенности структурированных типов вообще, а следовательно, и массивов — произвольная, поэтому количество элементов в списке индексных типов (размерность массива) не ограничено, однако суммарная длина внутреннего представления любого массива не может быть больше 2 Гбайт. В памяти ПК элементы массива следуют друг за другом так, что при переходе от младших адресов к старшим наиболее быстро меняется самый правый индекс массива.

то в памяти последовательно друг за другом будут расположены байты со значениями 1,3,2,4 . Это обстоятельство может оказаться важным при использовании стандартной процедуры копирования памяти MoveMemory.

В Object Pascal можно одним оператором присваивания передать все элементы одного массива другому массиву того же типа, например:

a,b : array [1..5] of Single;

После этого присваивания все пять элементов массива а получат те же значения, что и в массиве в. Замечу, что объявление

создаст разные типы массивов, поэтому оператор

вызовет сообщение об ошибке.

Над массивами не определены операции отношения. Нельзя, например, записать

Сравнить два массива можно поэлементно, например:

a,b : array [1..5] of Single;

eq := True; for i := 1 to 5 do

eq := False/if eq then

В версии Delphi 4 впервые введены так называемые динамические массивы. При объявлении таких массивов в программе не следует указывать границы индексов:

A: array of Integer;

В: array of array of Char;

C: array of array of array of Real;

В этом примере динамический массив а имеет одно измерение, массив в — два и массив с — три измерения. Распределение памяти и указание границ индексов по каждому измерению динамических массивов осуществляется в ходе выполнения программы путем инициации массива с помощью функции setLength. В ходе выполнения такого оператора:

одномерный динамический массив а будет инициирован, т. е. получит память, достаточную для размещения трех целочисленных значений. Нижняя граница индексов по любому измерению динамического массива всегда равна 0, поэтому верхней границей индексов для а станет 2.

Фактически идентификатор динамического массива ссылается на указатель (см. гл. 9), содержащий адрес первого байта памяти, выделенной для размещения массива. Поэтому для освобождения этой памяти достаточно присвоить идентификатору значение nil (другим способом является использование процедуры Finalize):

А,В: array of Integer;

При изменении длины уже инициированного динамического массива по какому-либо его измерению сначала резервируется нужная для размещения нового массива память, затем элементы старого массива переносятся в новый, после чего освобождается память, выделенная прежнему массиву. Чтобы сократить дополнительные затраты времени, связанные с изменением границ большого динамического массива, следует сразу создать массив максимальной длины.

В многомерных массивах сначала устанавливается длина его первого измерения, затем второго, третьего и т. д. Например:

A: array of array of Integer; //Двумерный динамический массив begin

//Устанавливаем длину первого измерения (количество столбцов):

//Задаем длину каждого столбца:

Обратите внимание: в отличие от обычных массивов стандартного Паскаля (и Object Pascal), динамические массивы могут иметь разную длину по второму и следующим измерениям. В предыдущем примере определен квадратный массив 3х3. Однако ничто не мешает нам создать, например, треугольный массив:

//Задаем длину каждого столбца:

В многомерных динамических массивах каждый элемент любого из N-1 измерений (N — количество измерений) представляет собой динамический массив и, следовательно, нуждается в инициации. Вот как, например, можно инициировать вещественный кубический массив 3х3х3:

A: array of array of array of Real;

for i := 0 to 2 do

for j := 0 to 2 do SetLength

Читать еще:  Thread terminate delphi
Ссылка на основную публикацию
Adblock
detector