Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.02.2015, 10:25
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
Вопрос Прямой порядок чтения из MemoryStream

Вот такая задача:
Имеем MemoryStream, в котором записано
Код:
00 00 00 0A
Это число 10 как можно понять. Пытаюсь это число прочитать:
Код:
var
A:TMemoryStream;
C:Integer;
Begin
// ... загружаем эти байты из файла не суть
A.Seek(0, soFromBeginning);
A.Read(C,4);
A.Free;
end;
И после чтения я получаю результат 167772160, т.е. 0A 00 00 00... все логично прочитало как число в обратном порядке. Но как его прочитать в прямом порядке? Предполагаю что ничего сложного, но использовать циклы и читать по 1 байту как-то не комильфо.
Подскажите кто знает.
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием
  #2  
Старый 11.02.2015, 11:27
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Данные так перевёрнутыми и хранятся везде - вроде в проц так их вгонять проще

Можно сделать так:
Код:
...

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));
Правда это работает с типизированным байтовым файлом, в смысле с file of byte, но вроде должно и с потоком прокатить, к сожалению, такое не проверял
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
SCrat.ORS (12.02.2015)
  #3  
Старый 11.02.2015, 11:35
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

Ох как же мог забыть про это:
Код:
C:= StrToInt('$' + bth(b4) + bth(b3) + bth(b2) + bth(b1));
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием
  #4  
Старый 11.02.2015, 12:20
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Big Endian, Little Endian.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 15.02.2015, 04:47
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Big Endian, Little Endian.
Только сейчас дошло
Код:
c:= swap(c shr 16) or (swap(c) shl 16);
Ответить с цитированием
  #6  
Старый 15.02.2015, 13:57
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

А еще есть
Код:
asm
   bswap eax
end;
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #7  
Старый 15.02.2015, 14:38
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Есть менее задротский вариант: hton, ntoh.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
Bargest (15.02.2015)
  #8  
Старый 15.02.2015, 14:54
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

Что-то вообще не понимаю о чем вы =D ... можно по-русски?
Я конечно нашёл функцию htonl в модуле WinSock, и она "переворачивает" да...
__________________
Програмистами не рождаются, ими становятся!

Последний раз редактировалось SCrat.ORS, 15.02.2015 в 15:01.
Ответить с цитированием
  #9  
Старый 15.02.2015, 15:31
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

А что понимать? Есть нормальный вариант - LittleEdian, поскольку гарантирует элементарное преобразование типов к меньшим, при этом байты в числе записываются от младшего к старшему, т.е. в обратном порядке. Этот стандарт используется на персональных компьютерах. Но некоторые гении из моторолы и IBM решили, что числа должны записываться так, как привык человек, и сделали у себя BigEdian, в котором числа записываются как обычно. И этот стандарт часто используется во всяких "кросс-платформенных" вещах. Вот и появилось два стандарта, а вместе с ними и неизбежные функции конвертирования одного в другое, заключающиеся в простой перестановке байт в числе.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 15.02.2015 в 15:34.
Ответить с цитированием
  #10  
Старый 15.02.2015, 15:41
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

Это я понял еще когда M.A.D.M.A.N. написал. Я не понял функции преобразования =) Ассемблерную функцию, hton, ntoh =) как с ними работать.
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием
  #11  
Старый 15.02.2015, 16:14
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Да это дядьки шутят так, в вашем варианте поможет и это
Код:
...
A.Read(C,4);
c:= swap(c shr итд.
A.Free;
end;
Swap кстати, это и есть обёртка над bswap eax, как и завещали отцы :-)
Ответить с цитированием
  #12  
Старый 15.02.2015, 16:17
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Ассемблерная там не функция, а одна команда. bswap инвертирует порядок байт в регистре. hton/ntoh - POSIX-функции, преобразующие число в/из bigedian из/в машинный порядок.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #13  
Старый 15.02.2015, 16:22
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

Ну дядьки хорошо вы шутите
Поклон вам низкий в ноги прям Суть понятна. Вопрос решён. Всем спасибо.

Код:
// Перестановка байт 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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:07.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter