|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
своп вещественных чисел
часто сталкиваюсь с ситуацией, когда в файле содержится перевернутое число. для того чтобы число стало нормальным его байты необходимо перевернуть. в delphi для свопирования целых 2х байтных чисел есть функция swap.
для целых 4х байтных мне посчастливилось найти функцию реализованную на ассемблере: Код:
function SwapDWorD(X:DWord):dword;assembler; asm bswap eax end; |
#2
|
||||
|
||||
Самопал:
Код:
a := (a shl 24) or ((a and $FF00) shl 8) or ((a and $FF0000) shr 8) or ((a and $FF000000) shr 24); Можно и так: Код:
a := Swap(a shr 16) or (Swap(a) shl 16); jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Tonyy (23.05.2013)
|
#3
|
|||
|
|||
Ну если можно использовать SwapDWord, то наверно так -
Код:
SwapSingle(X:Single):Single; var R:record case boolean of true: (Y:Single); false: (Z:Dword); end; begin R.Y:=X; R.Z:=SwapDWorD(R.Z); Result:=R.Y; end; ну и до кучи Код:
SwapDouble(X:Double):Double; var R:record case boolean of true: (Y:Double); false: (Z1,Z2:Dword); end; Z:Dword; begin R.Y:=X; Z:=SwapDWorD(R.Z1); R.Z1:=SwapDWorD(R.Z2); R.Z2:=Z; Result:=R.Y; end; |
#4
|
||||
|
||||
Цитата:
|
#5
|
|||
|
|||
приведенные реализации, как я понял, только ведь для целых чисел, так?
а как все-таки свопировать тип single? |
#6
|
||||
|
||||
Цитата:
Код:
var S: Single; begin S := Single(SwapDWord(LongWord(S)); end; |
#7
|
||||
|
||||
Цитата:
jmp $ ; Happy End! The Cake Is A Lie. |
#8
|
||||
|
||||
Цитата:
|
#9
|
||||
|
||||
Цитата:
|
#10
|
||||
|
||||
Сомневаюсь. "Умники", придумавшие big-edian, по-моему его везде запихали, где только смогли. В то время как сингловый 1 хранится на х86 как 00 00 80 3F, т.е. в обратном порядке, как и остальные числа в little-edian.
И, кстати, пруф: жава юзает big-edian в .class файлах. Мне для чтения флоат-констант из файла пришлось делать Код:
ival = bswap(*(int*)(&pData[1])); fval = *(float*)&ival; jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 03.06.2013 в 15:04. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Freeman (03.06.2013)
|
#11
|
||||
|
||||
Цитата:
|