Здравствуйте. Есть необходимость в 32-bits слове сделать перестановку байт. Во всех доступных ресурсах есть множество готовых функций, но они, к сожалению, не подходят, потому, как меняют местами слова W0 и W1.
А мне необходимо поменять местами байты по схеме:
Исходный: b3-b2-b1-b0
SWAP: b2-b3-b0-b1
Каким способом это возможно реализовать в Delphi XE6 ?
Здравствуйте, Softwarer, Вы писали:
S>Здравствуйте, Серж, Вы писали:
С>>Каким способом это возможно реализовать в Delphi XE6 ?
S>Их столько, что трудно перечислить. Каким пробуете Вы и что у Вас не получается?
Я еще не пробовал, только ищу варианты и изучаю матчасть, рассматриваю примеры.
Здравствуйте, LuciferSaratov, Вы писали:
LS>Здравствуйте, Серж, Вы писали:
С>>Каким способом это возможно реализовать в Delphi XE6 ?
LS>для подобных вещей в паскале есть очень удобное слово absolute.
На этом и остановился, спасибо:
function TForm1.Swap32(Value: LongWord): LongWord; //register; overload;
var
B: Byte; // временный байт
WordArr: array[0..3] of byte; // массив из 4-х байт
W: LongWord absolute WordArr; // 32-битное Word с таким же начальным адресом в памяти как и массив WordArr
begin
W:= Value; // присваиваем Word-у значение Word в котором нужно переставить местами байты
B:= WordArr[0]; // присваиваем временному байту значение [0] байта массива (потому что оно затрется)
WordArr[0]:= WordArr[1]; // присваиваем [0] байту массива значение [1] байта
WordArr[1]:= B; // присваиваем [1] байту массива значение временного байта
B:= WordArr[2]; // аналогично...
WordArr[2]:= WordArr[3];
WordArr[3]:= B;
result:= W; // очень важная строка в этой функции :)
end;
Здравствуйте, Alex.Che, Вы писали:
>> я бы написал как-то так:
AC>если не ошибаюсь, автору нужно менять 0-й байт с 3-м, а 1-й со 2-м. AC>у тебя это не так.
Здравствуйте, LuciferSaratov, Вы писали:
LS>Здравствуйте, Alex.Che, Вы писали:
>>> я бы написал как-то так:
AC>>если не ошибаюсь, автору нужно менять 0-й байт с 3-м, а 1-й со 2-м. AC>>у тебя это не так.
LS>
LS>Исходный: b3-b2-b1-b0
LS>SWAP: b2-b3-b0-b1
LS>да вроде все так — нужно сделать Swap для слов
Нет, не для слов. Swap нужен для перестановки байт.
Как есть: 22 C5 FC 41
Как нужно: C5 22 41 FC
Порядок байт в файле-исходнике (22 C5 FC 41) — считываю байты с файла-исходника в переменную TimeW0: file (22 C5 FC 41) — SWAP и сохранение в переменную TimeW0: file (FC 41 22 C5) — записываю во вновь созданный файл (C5 22 41 FC).
Получается, что запись в файл идет зеркальная.
Здравствуйте, Серж, Вы писали:
С>Здравствуйте. Есть необходимость в 32-bits слове сделать перестановку байт. Во всех доступных ресурсах есть множество готовых функций, но они, к сожалению, не подходят, потому, как меняют местами слова W0 и W1. С>А мне необходимо поменять местами байты по схеме: С>Исходный: b3-b2-b1-b0 С>SWAP: b2-b3-b0-b1 С>Каким способом это возможно реализовать в Delphi XE6 ?
windows.pas содержит такие вещи как HiWord(), LoWord(), делайте над ними Swap