Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2012, 02:49   #1
alumium
Пользователь
 
Регистрация: 17.08.2012
Сообщений: 17
Радость Cardinal или Integer в Array of Bytes

Существует C# функция Bitconverter.GetBytes, которая возвращает массив байт из переменной типа Cardinal, Integer и так далее. Есть ли её аналог в Delphi? Если нет то как её сделать?
alumium вне форума Ответить с цитированием
Старый 20.08.2012, 08:46   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а Вы с какой целью интересуетесь?

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

Например, так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i, j: integer;
    bbI : array[1.. sizeof(integer)] of byte absolute i;
begin
   i := $1234;
   for j := Low(bbI) to High(bbI)  do
       Memo1.Lines.Append(IntToHex(bbI[j],2))
end;
а можно через копирование нужной переменной в массив.
например, так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i, j: integer;
    bbI : array[1.. sizeof(integer)] of byte;
begin
   i := $1234;

   Move(i, bbI[1], SizeOf(Integer));

   for j := Low(bbI) to High(bbI)  do
       Memo1.Lines.Append(IntToHex(bbI[j],2))
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.08.2012, 08:50   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Не знаю есть или нет (попробуйте, собственно, погуглить и порыть справку), но обычно такое навелосипедить быстрее, чем гуглить. Кто как велосипедит - нередко через "вариативную запись" (точно не помню как называется, это record в которой есть case). Можно вполне просто через указатели сделать, объявить 2 типа (из какого в какой конвертить), объявить 2 переменные этих типов, взять их указатели, приравнять их указатели и конверсия готова.

Вот мой вариант, написал тут и не проверял ) для остальных типов советую перегрузить функцию нужное число раз. Правда не совсем получается возврат массива байт, но смысл я думаю понятен, можно подогнать.
Код:
function GetByte(Aint: Integer; ByteIdx: Byte): Byte;
const
  SizeMax = 3
type
  TBytes = array[0..SizeMax] of Byte;
var
  Bytes: TBytes absolute AInt;
begin
  Assert(ByteIdx <= Sizemax, 'Bang-Bang my babe shot me down...');
  Result := Bytes[ByteIdx];
end;
ПС. Блин, Serge опередил на пару минут, пока я писал... хотя оба писали наперегонки))

пс2. Хотя напишу и возврат массива.
Код:
type
  TByteDynArray = array of Byte;
...
procedure GetByte(Aint: Integer; var Bytes: TByteDynArray); // массив надо создать и передавать сюда
begin
  SetLength(Bytes, SizeOf(AInt));
  CopyMemory(Bytes, @Aint, SizeOf(AInt));
end;
// вызов
var b : tbyteDynarray;
...
  SetLength(b, 1);
  GetByte(65535, b); // число любое ессно
  ShowMessage(Format('%d %d %d %d', [b[0], b[1], b[2], b[3]]));
Ещё вот что нашёл:
LongRec, WordRec, Int64Rec - записи с возможностью разбора чисел по словам и байтам, опробуй их.

Последний раз редактировалось phomm; 20.08.2012 в 09:15.
phomm вне форума Ответить с цитированием
Старый 21.08.2012, 08:42   #4
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Код с коленки... Но как минимум первый вариант работать будет.
Код:
procedure SomeProc(Inp:Cardinal);
var
	Arr: array [0..SizeOf(Inp)] of byte absolute Inp;
	Arr2: array [0..SizeOf(Inp)] of Byte absolute Inp;
	Arr3: string[SizeOf(Inp)+1] absolute Inp;
	Arr4: array [0..SizeOf(Inp)] of byte;
begin
	Pointer(Arr4) := @Inp;
	//some code
end;
Третий вариант - использование строки в качестве массива чаров. Доступ Byte(Arr3[0])
Четвертый вариант - если absolute не реализована или устарела в компиляторе.

Тут уж, как говорится, на вкус и цвет...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 21.08.2012 в 08:52.
Johnson вне форума Ответить с цитированием
Старый 21.08.2012, 17:02   #5
alumium
Пользователь
 
Регистрация: 17.08.2012
Сообщений: 17
Радость

Спасибо друзья, за оказанную помощь. Самый короткий и рабочий вариант оказался этот:

Цитата:
Сообщение от Serge_Bliznykov
procedure TForm1.Button1Click(Sender: TObject);
var i, j: integer;
bbI : array[1.. sizeof(integer)] of byte;
begin
i := $1234;

Move(i, bbI[1], SizeOf(Integer));

for j := Low(bbI) to High(bbI) do
Memo1.Lines.Append(IntToHex(bbI[j],2))
end;
alumium вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Integer или String Pasha_Sh Общие вопросы Delphi 5 29.06.2012 22:46
преоброзования Byte Array to Single and Integer mrCloud Общие вопросы Delphi 1 14.06.2011 21:08
a:array[1..50] of integer; KulOle Паскаль, Turbo Pascal, PascalABC.NET 1 25.12.2008 19:16
задать массив типа X: array [0..N] of integer -где N переменная читаеться из EditBox Kivin13 Общие вопросы Delphi 22 06.09.2007 09:25
Array или не array Димарик Общие вопросы Delphi 4 18.06.2007 15:16