|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Прямой порядок чтения из MemoryStream
Вот такая задача:
Имеем 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.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
||||
|
||||
Цитата:
Код:
c:= swap(c shr 16) or (swap(c) shl 16); Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#6
|
||||
|
||||
А еще есть
Код:
asm bswap eax end; jmp $ ; Happy End! The Cake Is A Lie. |
#7
|
||||
|
||||
Есть менее задротский вариант: hton, ntoh.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо 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, в котором числа записываются как обычно. И этот стандарт часто используется во всяких "кросс-платформенных" вещах. Вот и появилось два стандарта, а вместе с ними и неизбежные функции конвертирования одного в другое, заключающиеся в простой перестановке байт в числе.
jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось 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 из/в машинный порядок.
jmp $ ; Happy End! The Cake Is A Lie. |
#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. |