Как бы при чтении структуры из файла "перевернуть" значения
От: Аноним  
Дата: 01.04.04 14:20
Оценка:
имеется структура
TRec = record
   x,y,z : integer;
end;


файл представляет собой следующий набор байтов
 00 00 02 00 00 00 03 00 00 00 04 00


данные цифры имеют смысл — числа 512, 768, 1024

но при чтении
 FileSream.ReadBuffer(Rec, sizeof(TRec));


получаются другие значения , т.к. они рассматриваются как $00020000, $00030000, $00040000
вот и не понятно как быть. Перевернуть впринципе не очень сложно. Но как избавится от того чтобы зачитывать каждое поле структуры отдельно.
т.е. пока вижу только способ
  Rec.x := MyFileStream.MyReadSwappedInt;
  Rec.y := MyFileStream.MyReadSwappedInt;
  Rec.z := MyFileStream.MyReadSwappedInt;


ладно когда 3 поля , но когда их около 50-ти то вероятность ошибки велика.
по сравнению с чтением сразу структуры целиком.

Мож кто-нибуть посоветует приемлемый способ ...
Re: Как бы при чтении структуры из файла "перевернуть" значе
От: slava5  
Дата: 01.04.04 15:44
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Мож кто-нибуть посоветует приемлемый способ ...


Ежели все на integer то может в асме bswap?

Удачи. Slava V.
Re: Как бы при чтении структуры из файла "перевернуть" значе
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.04.04 15:48
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А откуда у тебя взялся такой странный файл? Почему структуры так развернуты?
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Как бы при чтении структуры из файла "перевернуть" зн
От: Аноним  
Дата: 01.04.04 15:59
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, <Аноним>, Вы писали:


S>А откуда у тебя взялся такой странный файл? Почему структуры так развернуты?


Ну откуда это секрет. я сам не знаю откуда они. Но смотрю их документацию и примеры ,
открываю hex просмотр и вижу что там все перевернуто. Хотя в документации структуры писались на c++.
Вот такая вот петрушка. Может там есть директива компилятора которая переворачивает int8, int16, int32 данные.
Re: Как бы при чтении структуры из файла "перевернуть" значе
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.04.04 16:00
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>имеется структура

А>
А>TRec = record
А>   x,y,z : integer;
А>end;
А>


А>файл представляет собой следующий набор байтов

А>
А> 00 00 02 00 00 00 03 00 00 00 04 00
А>


А>данные цифры имеют смысл — числа 512, 768, 1024


А>но при чтении

А>
А> FileSream.ReadBuffer(Rec, sizeof(TRec));
А>


Желательно всегда для сериализуемых структур делать
TRec = packed record
x,y,z : integer;
end;

Никогда не встречал проблем
Как запишешь
FileStream.WriteBuffer(Rec, sizeof(TRec));
так и прочтешь
FileStream.ReadBuffer(Rec, sizeof(TRec));
А вообщето последовательность байтов от младших к старшим.
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Re[2]: Как бы при чтении структуры из файла "перевернуть" зн
От: Аноним  
Дата: 01.04.04 16:06
Оценка:
S> Никогда не встречал проблем
S> Как запишешь
S> FileStream.WriteBuffer(Rec, sizeof(TRec));
S> так и прочтешь
S> FileStream.ReadBuffer(Rec, sizeof(TRec));
S> А вообщето последовательность байтов от младших к старшим.

Ну да. т.е по файлу в привычном понимании это $00020000 но в документации четко сказано что первое поле (Size)
должно быть всегда = 512. т.е. $00000200, просто это очень древний формат 1991 года. и данные были сняты какой-то эксп. установкой, короче там могло быть такое что удобен был такой формат (перевернутый).
Я пробовал зачитывать просто Int 4 байта — та же история. Т.е. packed или нет тут не поможет. С packed я на всякий случай тоже пробовал — не помогло. Мож есть для структур что-то в духе inversedint
Re[3]: Как бы при чтении структуры из файла "перевернуть" зн
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.04.04 16:24
Оценка:
Здравствуйте, <Аноним>, Вы писали:

S>> Никогда не встречал проблем

S>> Как запишешь
S>> FileStream.WriteBuffer(Rec, sizeof(TRec));
S>> так и прочтешь
S>> FileStream.ReadBuffer(Rec, sizeof(TRec));
S>> А вообщето последовательность байтов от младших к старшим.

А>Ну да. т.е по файлу в привычном понимании это $00020000 но в документации четко сказано что первое поле (Size)

А>должно быть всегда = 512. т.е. $00000200, просто это очень древний формат 1991 года. и данные были сняты какой-то эксп. установкой, короче там могло быть такое что удобен был такой формат (перевернутый).
Да уж встречал такое когда нужна сортирвка, но как строк например в DBASE. Там и переворачивают их по простому. А насчет ассемблера тебе уже советовали.
А>Я пробовал зачитывать просто Int 4 байта — та же история. Т.е. packed или нет тут не поможет. С packed я на всякий случай тоже пробовал — не помогло. Мож есть для структур что-то в духе inversedint
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Re[4]: Как бы при чтении структуры из файла "перевернуть" зн
От: Аноним  
Дата: 01.04.04 16:41
Оценка:
S> Да уж встречал такое когда нужна сортирвка, но как строк например в DBASE. Там и переворачивают их по простому. А насчет ассемблера тебе уже советовали.
Но ассемблер удобно если мне нужно перевернуть 1 значение.
а если группу то придется каждое поле читать отдельным методом что не хочется делать.
т.е. перевернуть мы можем только 2, 4 байта
а если их 50 штук то как их всех перевернуть ?
только вызывая для каждого поля эту процедуру.
к сожалению в структуре появляются не только integer а еще и smallint а также array [1..N] of char
Re[5]: Как бы при чтении структуры из файла "перевернуть" зн
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.04.04 16:59
Оценка:
Здравствуйте, <Аноним>, Вы писали:

S>> Да уж встречал такое когда нужна сортирвка, но как строк например в DBASE. Там и переворачивают их по простому. А насчет ассемблера тебе уже советовали.

А>Но ассемблер удобно если мне нужно перевернуть 1 значение.
А>а если группу то придется каждое поле читать отдельным методом что не хочется делать.
А>т.е. перевернуть мы можем только 2, 4 байта
А>а если их 50 штук то как их всех перевернуть ?
А>только вызывая для каждого поля эту процедуру.
А>к сожалению в структуре появляются не только integer а еще и smallint а также array [1..N] of char

Что бы тебе не было так грустно посмотри как считывают в Net

 function BinaryReader.ReadInt64: Int64;
var num1: Cardinal;
num2: Cardinal;
 
begin Self.FillBuffer(8);
num1:= (((Self.m_buffer[0] or (Self.m_buffer[1] shl 8)) or (Self.m_buffer[2] shl 16)) or (Self.m_buffer[3] shl 24));
num2:= (((Self.m_buffer[4] or (Self.m_buffer[5] shl 8)) or (Self.m_buffer[6] shl 16)) or (Self.m_buffer[7] shl 24));
result:= ((UInt64(num2) shl 32) or UInt64(num1)) 
end;


Но для Double они gj xtkjdtxtcrb bpdhfnbkbcm

function BinaryReader.ReadDouble: Double;
var num1: Double;
objRef1: PDouble;

begin Self.FillBuffer(8);
objRef1:= @Self.m_buffer[0];
num1:= objRef1^;
objRef1:= nil;
result:= num1
end;
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Re[3]: Как бы при чтении структуры из файла "перевернуть" зн
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.04.04 17:05
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:
А> Ну откуда это секрет. я сам не знаю откуда они. Но смотрю их документацию и примеры ,
А>открываю hex просмотр и вижу что там все перевернуто. Хотя в документации структуры писались на c++.
А>Вот такая вот петрушка. Может там есть директива компилятора которая переворачивает int8, int16, int32 данные.
Нет там никакой директивы! Обычно такие проблемы (NUXI-problem) возникают при кросс-платформенном взаимодействии. Вот я и спрашиваю, где ты это взял — если передавалось по сети, то надо было с обоих концов пользоваться htons/ntohs и htonl/ntohl.
Впрочем, никто тебе не мешает написать свой слой взаимодействия с этой не-интеловской архитектурой. Никаких встроенных средств в языке нету. Просто вместо прямого ReadBuffer сделай свой ReadTRec(out Rec: TRec) и в нем аккуратно все переверни. (Да, int8 данные переворачивать не надо )
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.