![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Вот такая задача:
Имеем MemoryStream, в котором записано Код:
00 00 00 0A Код:
var A:TMemoryStream; C:Integer; Begin // ... загружаем эти байты из файла не суть A.Seek(0, soFromBeginning); A.Read(C,4); A.Free; end; Подскажите кто знает. |
|
#2
|
||||
|
||||
|
Данные так перевёрнутыми и хранятся везде - вроде в проц так их вгонять проще
![]() Можно сделать так: Код:
...
function bth(ds: byte): string;
const
b: string = '0123456789ABCDEF';
begin
Result:= b[(ds shr 4) + 1] + b[(ds and $F) + 1];
end;
...
var
b1, b2, b3, b4: byte;
...
AssignFile(
Reset(
Read(SomeFile, b1, b2, b3, b4);
C:= StrToInt('$' + bth(b4) + bth(b3) + bth(b2) + bth(b1)); |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
SCrat.ORS (12.02.2015)
| ||
|
#3
|
||||
|
||||
|
Ох как же мог забыть про это:
Код:
C:= StrToInt('$' + bth(b4) + bth(b3) + bth(b2) + bth(b1));![]() |
|
#4
|
||||
|
||||
|
Big Endian, Little Endian.
|
|
#5
|
||||
|
||||
|
Цитата:
Код:
c:= swap(c shr 16) or (swap(c) shl 16); |
|
#6
|
||||
|
||||
|
А еще есть
Код:
asm bswap eax end; ![]() |
|
#7
|
||||
|
||||
|
Есть менее задротский вариант: hton, ntoh.
|
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Bargest (15.02.2015)
| ||
|
#8
|
||||
|
||||
|
Что-то вообще не понимаю о чем вы =D ... можно по-русски?
Я конечно нашёл функцию htonl в модуле WinSock, и она "переворачивает" да... Последний раз редактировалось SCrat.ORS, 15.02.2015 в 15:01. |
|
#9
|
||||
|
||||
|
А что понимать? Есть нормальный вариант - LittleEdian, поскольку гарантирует элементарное преобразование типов к меньшим, при этом байты в числе записываются от младшего к старшему, т.е. в обратном порядке. Этот стандарт используется на персональных компьютерах. Но некоторые гении из моторолы и IBM решили, что числа должны записываться так, как привык человек, и сделали у себя BigEdian, в котором числа записываются как обычно. И этот стандарт часто используется во всяких "кросс-платформенных" вещах. Вот и появилось два стандарта, а вместе с ними и неизбежные функции конвертирования одного в другое, заключающиеся в простой перестановке байт в числе.
Последний раз редактировалось Bargest, 15.02.2015 в 15:34. |
|
#10
|
||||
|
||||
|
Это я понял еще когда M.A.D.M.A.N. написал. Я не понял функции преобразования =) Ассемблерную функцию, hton, ntoh =) как с ними работать.
|
|
#11
|
||||
|
||||
|
Да это дядьки шутят так, в вашем варианте поможет и это
Код:
... A.Read(C,4); c:= swap(c shr итд. A.Free; end; |
|
#12
|
||||
|
||||
|
Ассемблерная там не функция, а одна команда. bswap инвертирует порядок байт в регистре. hton/ntoh - POSIX-функции, преобразующие число в/из bigedian из/в машинный порядок.
|
|
#13
|
||||
|
||||
|
Ну дядьки хорошо вы шутите
Поклон вам низкий в ноги прям Суть понятна. Вопрос решён. Всем спасибо.Код:
// Перестановка байт 32-битового целого; подходит, например, // для передачи данных между процессорами Intel и Sun. function Swap32(Value: LongWord): LongWord; begin Result := Swap(Value shr 16) or (Swap(Value) shl 16); end; // Если действительно требуется переставить байты в 32-битовом // целом, например, для преобразования обратного порядка байт в // е прямой, используйте не функцию Swap, а инструкцию // BSWAP. function FastSwap(Value: LongWord): LongWord; register; overload; asm bswap eax end; // Для перестановки значения Int64 аргумент передается в стек, // а возвращаемое значение - в EAX:EDX. function FastSwap(Value: Int64): Int64; register; overload; asm mov edx, [esp+8] bswap edx mov eax, [esp+12] bswap eax end; Последний раз редактировалось SCrat.ORS, 15.02.2015 в 16:25. |