Вверх ↑
Этот топик читают: Гость
Ответов: 1343
Рейтинг: 31
#1: 2022-05-10 16:30:17 ЛС | профиль | цитата
как можно максимально быстро делать реверс 4-х байт ну и было бы не плохо так же 8 байт, классику с обратным направлением для for не предлагать

по факту данные хранятся ввиде Int64 либо Integer, так вот как числа подобных типов можно перевернуть правильным путём?


примеры:

нормал
AABBCCDD - 2864434397 0000AABBCCDDEEFF - 187723572702975

реверс
DDCCBBAA - 3721182122 FFEEDDCCBBAA0000 - -4822678189244416


4 байта восновном для float, так как оно храниться в обратном порядке
ну а 8 байт для указателей, так как те тоже храняться в обратном порядке

Редактировалось 1 раз(а), последний 2022-05-10 16:36:30
карма: 2

0
Ответов: 2236
Рейтинг: 676
#2: 2022-05-10 17:19:22 ЛС | профиль | цитата
Rysik, если необходимо получать данные из файла, то можно воспользоваться элементом DataToFileEx (Сохранение/загрузка данных в/из файл/файла) автор: Galkov.
Есть свойство BigEndian (True/False), так что можно читать как от старшего к младшему,так и на оборот. Если что из него можно и "выковырять" нужный код для вставки в IC.
Элемент не стандартный, на форуме выкладывали.

Редактировалось 3 раз(а), последний 2022-05-10 17:20:27
карма: 11

0
Ответов: 8921
Рейтинг: 823
#3: 2022-05-10 20:17:38 ЛС | профиль | цитата
sla8a писал(а):
DataToFileEx


.
if _prop_BigEndian then Reverse(@i);
.
procedure THIDataToFileEx.Reverse;
var pb,pe:^byte; b:byte;
begin
pb := p; pe := pb; inc(pe, _prop_DataSize-1);
while dw(pb) < dw(pe) do begin
b := pb^; pb^ := pe^; pe^ := b;
inc(pb); dec(pe);
end;
end;
карма: 19

0
Ответов: 307
Рейтинг: 26
#4: 2022-05-10 20:37:28 ЛС | профиль | цитата
sla8a писал(а):
Элемент не стандартный, на форуме выкладывали.



DataToFileEx-https://forum.hiasm.com/getfile/39444

DataToFileEx_NS_mod_2020-04-21-https://forum.hiasm.com/getfile/39445
карма: 2
0
Ответов: 783
Рейтинг: 168
#5: 2022-05-12 11:06:51 ЛС | профиль | цитата
Rysik писал(а):
как можно максимально быстро делать реверс 4-х байт ну и было бы не плохо так же 8 байт

Нашёл только .NET BitConverter Класс. https://docs.microsoft.com/ru-ru/dotnet/api/system.bitconverter?view=net-6.0
Попробовал подключить. Скорость что-то не очень.
Схема для пробы.
Add(MainForm,3688957,434,210)
{
Width=543
Height=258
link(onCreate,14211046:doConsoleExec,[(480,230)(480,258)])
}
Add(Button,6027910,273,140)
{
Left=225
Top=105
link(onClick,1318132:doEvent1,[])
}
Add(ListBox,11735890,357,84)
{
Left=15
Top=25
Width=195
Height=75
Font=[MS Sans Serif,10,0,0,1]
Strings=#10:2864434397|10:3721182122|0:|
}
Add(ArrayEnum,10354728,371,140)
{
link(onItem,3073005:doConvert,[])
link(Array,11735890:Array,[])
}
Add(ListBox,16049722,588,140)
{
Left=15
Top=110
Width=195
Height=75
Font=[MS Sans Serif,10,0,0,1]
DataType=1
}
Add(StreamConvertor,12021712,476,140)
{
Mode=1
link(onResult,5437852:doGet,[])
}
Add(Convertor,3073005,420,140)
{
Mode=6
link(onResult,12021712:doConvert,[])
}
Add(DataToFileEx,5437852,532,140)
{
DataSize=4
link(onGet,16049722:doAdd,[])
}
Add(ListBox,6146988,364,203)
{
Left=310
Top=25
Width=195
Height=75
Font=[MS Sans Serif,10,0,0,1]
Strings=#15:187723572702975|17:-4822678189244416|20:-6148895925951734307|17:63275574478219900|
}
Add(ListBox,461828,665,238)
{
Left=310
Top=110
Width=195
Height=75
Font=[MS Sans Serif,10,0,0,1]
DataType=1
}
Add(ArrayEnum,9456868,378,259)
{
link(onItem,9189398:doString,[])
link(Array,6146988:Array,[])
}
Add(Hub,1318132,322,140)
{
link(onEvent1,10354728:doEnum,[])
link(onEvent2,9456868:doEnum,[(354,153)(354,265)])
}
Add(WinExec,14211046,490,238)
{
FileName="powershell"
Mode=0
Point(doConsoleExec)
Point(doConsoleInput)
}
Add(ClipboardHook,12507369,553,238)
{
NextHook=1
link(onChange,3920480:doCompare,[])
}
Add(StrMask,3920480,609,238)
{
link(onFalse,461828:doAdd,[])
}
Add(FormatStr,9189398,434,259)
{
DataCount=1
Mask="$a=[bitconverter]::GetBytes(%1)\r\n[array]::Reverse($a)\r\n[bitconverter]::ToInt64($a,0) | Set-Clipboard\r\n"
link(onFString,14211046:doConsoleInput,[])
}


Редактировалось 1 раз(а), последний 2022-05-12 11:07:29
карма: 15

0
Ответов: 4628
Рейтинг: 749
#6: 2022-05-14 17:30:52 ЛС | профиль | цитата
Ну, я же когда-то тебе давал IC для целых чисел. Вот с примером кода для 8-байтных чисел и применения для Single/Double.

Add(MainForm,14667778,308,133)
{
Position=1
}
Add(Edit,10593851,490,126)
{
Left=20
Top=20
Width=85
Text="AABBCCDD"
}
Add(Button,7642022,434,175)
{
Left=120
Top=20
link(onClick,14795348:doConvert,[])
}
Add(Label,2287541,651,175)
{
Left=185
Top=25
}
Add(Convertor,14795348,490,175)
{
Mode=5
link(onResult,11970995:doBSwap,[])
link(Data,10593851:Text,[])
}
Add(Convertor,9711378,602,175)
{
Mode=6
link(onResult,2287541:doText,[])
}
Add(InlineCode,11970995,546,175)
{
WorkPoints=#7:doBSwap|
EventPoints=#8:onResult|
DataPoints=#6:IntNum|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|23: IntNum: THI_Event;|28: onResult: THI_Event; |54: procedure doBSwap(var _Data: TData; Index: Word);|5: end;|0:|14:implementation|0:|87:function BSwap(X: LongWord): LongWord; assembler; {$ifdef FPC64} nostackframe; {$endif}|3:asm|16: {$ifdef WIN64}|34: mov eax, ecx // ECX = x in 64bit|10: {$endif}|11: bswap eax|4:end;|0:|14:{$ifdef WIN64}|0:|83:function BSwap64(X: Int64): Int64; assembler; {$ifdef FPC64} nostackframe; {$endif}|3:asm|25: mov rax, rcx // RCX = x|11: bswap rax|4:end;|80://Result := (Int64(Endian(LongWord(X))) shl 32) or (Endian(LongWord(X shr 32)));|0:|7:{$else}|0:|40:function BSwap64(const X: Int64): Int64;|4:type|22: Ti64 = packed record|21: Lo, Hi: LongWord;|6: end;|5:begin|39: Ti64(Result).Lo := BSwap(Ti64(X).Hi);|39: Ti64(Result).Hi := BSwap(Ti64(X).Lo);|4:end;|0:|8:{$endif}|0:|0:|0:|59:procedure THiAsmClass.doBSwap(var _Data:TData; index:word);|5:begin|74: _hi_CreateEvent(_Data, @onResult, BSwap(ReadInteger(_Data, IntNum, 0)));|4:end;|0:|0:|0:|19:// Для других типов|15:procedure Test;|4:type|22: PInteger = ^Integer;|18: PInt64 = ^Int64;|3:var|20: MySingle: Single; |91: TmpInt: Integer absolute MySingle; // TmpInt указывает на память, выделенную под MySingle|19: MyDouble: Double;|36: TmpInt64: Int64 absolute MyDouble;|5:begin|0:|61: // Для типов Single/Double берется указатель на переменную,|77: // приводится к целому типу нужного размера и вызывается функция для целого|54: PInteger(@MySingle)^ := BSwap(PInteger(@MySingle)^);|52: PInt64(@MyDouble)^ := BSwap64(PInt64(@MyDouble)^);|5: |45: // Или с использованием директивы absolute.|59: // Работа идёт со значениями перменных MySingle/MyDouble|26: TmpInt := BSwap(TmpInt);|34: TmpInt64 := BSwap64(TmpInt64); |4:end;|0:|4:end.|
link(onResult,9711378:doConvert,[])
}
карма: 26

0
Ответов: 1343
Рейтинг: 31
#7: 2022-05-18 11:49:26 ЛС | профиль | цитата
как оказалось данные при правильном изъятии, приобретают правильный вид))

для Int(последующей конвертации в float) pInteger(buf)^
для Int64 pInt64(buf)^

Редактировалось 1 раз(а), последний 2022-05-18 11:49:58
карма: 2

0
7
Сообщение
...
Прикрепленные файлы
(файлы не залиты)