Как бы при чтении структуры из файла "перевернуть" значения
От:
Аноним
Дата:
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
вот и не понятно как быть. Перевернуть впринципе не очень сложно. Но как избавится от того чтобы зачитывать каждое поле структуры отдельно.
т.е. пока вижу только способ
А откуда у тебя взялся такой странный файл? Почему структуры так развернуты?
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Как бы при чтении структуры из файла "перевернуть" зн
От:
Аноним
Дата:
01.04.04 15:59
Оценка:
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, <Аноним>, Вы писали:
S>А откуда у тебя взялся такой странный файл? Почему структуры так развернуты?
Ну откуда это секрет. я сам не знаю откуда они. Но смотрю их документацию и примеры ,
открываю hex просмотр и вижу что там все перевернуто. Хотя в документации структуры писались на c++.
Вот такая вот петрушка. Может там есть директива компилятора которая переворачивает int8, int16, int32 данные.
Re: Как бы при чтении структуры из файла "перевернуть" значе
Здравствуйте, <Аноним>, Вы писали:
А>имеется структура А>
А>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]: Как бы при чтении структуры из файла "перевернуть" зн
Здравствуйте, <Аноним>, Вы писали:
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]: Как бы при чтении структуры из файла "перевернуть" зн
Здравствуйте, <Аноним>, Вы писали:
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;
Здравствуйте, <Аноним>, Вы писали: А> Ну откуда это секрет. я сам не знаю откуда они. Но смотрю их документацию и примеры , А>открываю hex просмотр и вижу что там все перевернуто. Хотя в документации структуры писались на c++. А>Вот такая вот петрушка. Может там есть директива компилятора которая переворачивает int8, int16, int32 данные.
Нет там никакой директивы! Обычно такие проблемы (NUXI-problem) возникают при кросс-платформенном взаимодействии. Вот я и спрашиваю, где ты это взял — если передавалось по сети, то надо было с обоих концов пользоваться htons/ntohs и htonl/ntohl.
Впрочем, никто тебе не мешает написать свой слой взаимодействия с этой не-интеловской архитектурой. Никаких встроенных средств в языке нету. Просто вместо прямого ReadBuffer сделай свой ReadTRec(out Rec: TRec) и в нем аккуратно все переверни. (Да, int8 данные переворачивать не надо )
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.