Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Вниз

"Упакованное число" - что бы это могло быть?   Найти похожие ветки 

 
Мирон ©   (2005-02-23 00:58) [0]

Здрасте всем, давненько сюда не заглядывал...

Тут такое дело... Надо прочитать файл.. Есть его описание...

struct.dat
---
Набор записей следующего вида:
1 байт   - раздел рубрикатора (цифры "0", "1" или "2")
255 байт - название раздела
4 байта  - упакованное число, кол-во вопросов,
          принадлежащих данному разделу
4 байта  - упакованное число, смещение в файле sections.ref
          до перечня номеров вопросов, приписанных
          к данному разделу


Вот что дает первая запись: "0   Грамматические трудности  -1425932288   -1339424768"  (остальное - того же типа)...
Первое и второе - верно, третье и четвертое - хрень какая-то...

Читаем так:

var
ID: String;
Size: Integer;
Name: String;
QCount, SRef: Integer;
begin
SetLength(ID, 1);
AStream.Read(ID[1], 1);

Size := 255;
SetLength(Name, Size);
AStream.Read(Name[1], Size);

AStream.Read(QCount, SizeOf(Integer));

AStream.Read(SRef, SizeOf(Integer));



Так вот... Если "упакованное число" в данном случае не "Integer", то что это может быть?


 
GanibalLector ©   (2005-02-23 01:37) [1]

Вот разница между Integer и 4 байтами :

MessageDlg(
"Ineteger:"+inttostr(High(Integer))+#10#13+
"DWord   :"+inttostr(High(DWord)),mterror,[MbOk],0);


 
Мирон ©   (2005-02-23 01:49) [2]

GanibalLector ©   (23.02.05 1:37) [1]
Ну, ладно... Имеем разницу в один бит, используемый под знак...
Только это не спасло комбинатора...

...
QCount, SRef: DWord;
...


имеем

"0   Грамматические трудности    2869035008   2955542528"

Или я не так понял намек?


 
GanibalLector ©   (2005-02-23 02:15) [3]

>Или я не так понял намек?
Правильно понял ;)
З.Ы.Извини,но мне в лом ... Я тут отдыхаю ;)


 
GanibalLector ©   (2005-02-23 02:21) [4]

А нафига тебе этот AStream сдался?
ИМХО у тебя с ним проблемы. Попробуй стандартно считать...должно получиться.
З.Ы.Я вот например не пользуюсь ТStream.А обычно в потоке на АПИ читаю\пишу.Пока нравиться и мне пофиг,что думают об этом остальные.


 
Мирон ©   (2005-02-23 02:54) [5]

GanibalLector ©   (23.02.05 2:21) [4]
Не... А че Stream-то сразу?
Первые 256 байт каждой записи считываются правильно ведь.... Проблема в том, что непонятно как в следующих 8 байтах хранятся 2 целых числа...

К слову, чувак, который генерил этот файл, генерил его из MySQl-вской базы... Не знаю правда чем он точно пользовался, но не "нормальными" средствами разработки приложений...  На Perl"e, что-ли делал... хрен его знает, какие они там эти "упакованные"...


 
GanibalLector ©   (2005-02-23 02:58) [6]

А что хоть должно получиться?Тебе известно?
Может перевернуть надо или еще чего...


 
GanibalLector ©   (2005-02-23 03:01) [7]

Кстати,где-то я это встечал : "упакованные"
Толи в схемотехнике,толи в логике.Что-то такое было...


 
Мирон ©   (2005-02-23 03:04) [8]

GanibalLector ©   (23.02.05 2:58) [6]
Ну, конкретные значения не известны... Но по логике - это не большие величины...
Он присылал один скриншот, с изображением того как это должно выглядеть в конечном итоге...
Так вот, там в разделе "Грамматических трудностей" значится 140 вопросов... Видимо, и здесь должна быть эта цифра..
Ну а вторая цифра (смещение) - там размер файла всего 50 кб, так что не больше 50*1024...


 
GanibalLector ©   (2005-02-23 03:13) [9]

Кстати,ты бы спросил... какое оно упакованное?

в шестнадцатеричной
AB020000  2869035008
B02A0000  2955542528

Судя по всему последние два байта выкидывай и попробуй что-нибудь...


 
Мирон ©   (2005-02-23 03:33) [10]

GanibalLector ©   (23.02.05 3:13) [9]
:)  Ну, если до четверга не разберусь, буду спрашивать, ессно... Когда он на работу выйдет..


 
Мирон ©   (2005-02-23 03:38) [11]

хм.. прикольно.. в файле всего 86 записей и в каждой последние два байта последних двух чисел - нули...

но... первые два тоже не дают ничего вразумительного


 
SammIk ©   (2005-02-23 03:39) [12]

Поисчи про двоичнодесятичные чмсла.
Там есть упакованые и нет, может поможет).
Ищи - BCD числа


 
begin...end ©   (2005-02-23 08:01) [13]

> Мирон ©   (23.02.05 0:58)

> Если "упакованное число" в данном случае не "Integer",
> то что это может быть?

Это, как уже сказал SammIk, может быть BCD-число (двоично-десятичное). Принцип формирования неупакованных BCD-чисел такой: берётся очередная цифра десятичного числа, под неё выделяется один байт, и в этот байт записывается значение этой цифры. Очевидно, что старшая тетрада байта при этом останется незаполненной. Вот так, например, будет выглядеть десятичное число 39 в неупакованном формате:

- в шестнадцатеричной системе: 03       09
- в двоичной системе:          00000011 00001001


В упакованном BCD-числе используется ещё и старшая тетрада байта, т.е. в одном байте умещаются две десятичные цифры. То же число 39 будет выглядеть так:

- в шестнадцатеричной системе:    3    9  
- в двоичной системе:          0011 1001


Возможно, я расположил байты не в том порядке.


 
VMcL ©   (2005-02-23 08:33) [14]

>>begin...end ©  (23.02.05 08:01) [13]

>берётся очередная цифра десятичного числа, под неё выделяется один байт

полубайт


 
SammIk ©   (2005-02-23 09:28) [15]

2 14
Полубайт это для упакованных))


 
Набережных С. ©   (2005-02-23 09:29) [16]


> VMcL ©   (23.02.05 08:33) [14]

Нет, под НЕупакованные - байт, begin...end прав.


 
Anatoly Podgoretsky ©   (2005-02-23 09:34) [17]

Мирон ©   (23.02.05 00:58)  
Привел бы хекс значения пары строк ланных и реальные значения чисел если известно.


 
Мирон ©   (2005-02-23 11:10) [18]

Anatoly Podgoretsky ©   (23.02.05 9:34) [17]

первая пара чисел         AB020000   B02A0000   (GanibalLector был прав)...
в фаре эти 8 байт выглядят несколько иначе  00 00 02 AB 00 00 2A BO

ну еще строчка  64010000  5С350000
в фаре          00 00 01 64 00 00 35 5С

На счет точных значений не уверен, но предположительно, что первое число первой пары "140", как я уже и говорил...


 
Мирон ©   (2005-02-23 11:42) [19]

begin...end ©   (23.02.05 8:01) [13]

почитал про BCD-числа.... получается, что в шестнадцатиричном представлении такого числа не может быть разрядов, содержащих a..f (кроме самой страшей триады)..
А здесь это есть...


 
begin...end ©   (2005-02-23 11:43) [20]

> Мирон ©   (23.02.05 11:10) [18]

Ну что ж... Теперь понятно, что это явно не BCD.

А в Фаре они нормально выглядят - сначала младший байт, потом старший и т.д.

Теряюсь в догадках.


 
begin...end ©   (2005-02-23 11:47) [21]

> Мирон ©   (23.02.05 11:42) [19]

> получается, что в шестнадцатиричном представлении такого
> числа не может быть разрядов, содержащих a..f

Верно.

> кроме самой страшей триады

Где Вы это прочитали?


 
Мирон ©   (2005-02-23 11:54) [22]

begin...end ©   (23.02.05 11:47) [21]
ссылку не дам, не помню... :)
читал, что эта тетрада используется под знак  1010 "+"   1011 "-"
или наоборот


 
Anatoly Podgoretsky ©   (2005-02-23 12:10) [23]

То есть ни какими упаковаными BCD здесь и не пахнет


 
Мирон ©   (2005-02-23 12:17) [24]

Anatoly Podgoretsky ©   (23.02.05 12:10) [23]
угу.. и не упакованными тоже....


 
Anatoly Podgoretsky ©   (2005-02-23 12:51) [25]

Тебе надо преобрести или паяльник или утюг и к автору в гости, расколется как миленький.


 
Мирон ©   (2005-02-23 12:55) [26]

Anatoly Podgoretsky ©   (23.02.05 12:51) [25]
Вариант не подходит... Он же мне потом платить за работу будет... :)


 
Anatoly Podgoretsky ©   (2005-02-23 13:08) [27]

Так что мешает спросить его о формате чисел, он же хочет, чтобы ему работу сделали. Паяльник до расплаты отложить в сторону. Потом пригодится, в будущем.


 
Мирон ©   (2005-02-23 14:54) [28]

дозвонился-таки до этого чела... он поведал, что это "большое целое, упакованное php-функцией до 4 байт"...
завтра обещал выслать порядок байт для распаковки...   и че было так мудрить....


 
Anatoly Podgoretsky ©   (2005-02-23 17:39) [29]

Похоже это просто Word -> dWord, возможно со смененым порядкоа байт по этому младшии байты равны нулю. Во всяком случае надо выяснять, желательно с примерами чисел.


 
Мирон ©   (2005-02-24 22:49) [30]

Вот какое значит дело... Цитирую...
----------8<--------------------

Теперь по поводу упакованного числа.
Формат: 32 bit, порядок следования байтов - big endian
Другими словами, число получается, если произвести следующие операции:
байт0 * (2 в степени 24) +
байт1 * (2 в степени 16) +
байт2 * (2 в степени 8) +
байт3 * (2 в степени 0)

Я проверил, числа распаковываются.
Но, поскольку это стандартный формат хранения большого целого,
думаю, предусмотрены какие-то стандартные функции для его получения
(в PHP, например, это unpack()).

----------8<--------------------

Много народу слышало про этот "стандартный формат"?  Я -нет...


 
Anatoly Podgoretsky ©   (2005-02-24 22:55) [31]

Обратный порядок байт, поменяй порядок и получишь обычный integer.

64 01 00 00  -> 00 00 01 64 -> 356
5С 35 00 00  -> 00 00 35 5c -> 13360


 
GuAV ©   (2005-02-24 23:00) [32]

Стандарные Windows - htonl, ntohl
Стандарные - не знаю, видимо нет.

function unpack(I: DWORD): DWORD;
asm
 BSWAP EAX
end;


 
Мирон ©   (2005-02-25 01:25) [33]

Anatoly Podgoretsky ©   (24.02.05 22:55) [31]
GuAV ©   (24.02.05 23:00) [32]

Оно!


 
Мирон ©   (2005-02-25 01:44) [34]

GuAV ©   (24.02.05 23:00) [32]

Н-нда... В восемь раз меньше строк, чем в моем варианте... :)


 
SammIk ©   (2005-02-25 03:02) [35]

PЗабавно, а почему поменяв направления байт - назвали упакованным?


 
Anatoly Podgoretsky ©   (2005-02-25 09:12) [36]

Оставим на совести называльщика.



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.035 c
3-1108804828
saNat
2005-02-19 12:20
2005.03.20
Внедрение изображения в поле записи


3-1108471937
Mishenka
2005-02-15 15:52
2005.03.20
Сортировка набора данных


1-1110071971
ArchValentin
2005-03-06 04:19
2005.03.20
Запреты на запуск программ


9-1103914428
Макс
2004-12-24 21:53
2005.03.20
L3dt 2.2


3-1108618275
DelphiN!
2005-02-17 08:31
2005.03.20
Удаление записей в Paradox-e





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский