Форум: "Прочее";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];
ВнизНеясности в формате файла Найти похожие ветки
← →
Sha © (2010-07-21 11:33) [240]> Виталий © (21.07.10 09:09) [236]
> Я именно в материале по первой ссылке и прочел описание каталоговой записи
Там же описан способ хранения длинных имен.
Т.е. сектор каталога может содержать записи двух типов.
Чтобы выполнить задание [234] надо просто добавить к коду
недостающее описание и переписать GetUniLFN.
> Виталий © (21.07.10 11:12) [239]
> Но как из описания полей можно понять,
> что за хитрые вещи проводятся с их содержимым и для чего?
Никак.
Потому что у автора нет описания этих полей для случая
хранения на тех же местах частей длинного имени.
← →
Sha © (2010-07-21 11:44) [241]> Sha © (21.07.10 11:33) [240]
> Никак.
Ну, или знать,
что в IA-32 целые типы хранятся в Little Endian (меньшим концом вперед) представлении,
что Chr(i) эквивалентно Chr(Byte(i)) или Chr(i and 255),
что после Shr 8 первый байт становится нулевым, второй - первым и т.д.,
что после Shr 16 .........
← →
Anatoly Podgoretsky © (2010-07-21 11:51) [242]> Виталий (21.07.2010 11:12:59) [239]
Мы уже говорили про WinApi, а здесь надо знать DOSApi, что проще, но уже все
забыли.
Ты не в ту степь полез.
← →
Anatoly Podgoretsky © (2010-07-21 11:52) [243]> Sha (21.07.2010 11:33:00) [240]
Автор честно признается, что он не пользовалься документированой
информацией, а делал хакерский анализ и не несет ответственности за
достоверность данной информации.
← →
Sha © (2010-07-21 11:59) [244]> Anatoly Podgoretsky © (21.07.10 11:51) [242]
> а здесь надо знать DOSApi,
Да там ваще никакой апи не нужен.
Обычная функция преобразования данных.
Достаточно уметь работать с массивами и со структурами данных.
Объявить record как надо и пройтись по массиву record"ов,
сцепляя данные в одно длинное имя.
← →
Anatoly Podgoretsky © (2010-07-21 12:11) [245]> Sha (21.07.2010 11:59:04) [244]
Ты разве не видел там int 21/25 АПИ в ДОС реализовывалось через вызов
прерывания.
← →
Sha © (2010-07-21 12:21) [246]> Anatoly Podgoretsky © (21.07.10 12:11) [245]
Мы ща говорим конкретно о функции GetUniLFN
← →
Anatoly Podgoretsky © (2010-07-21 12:26) [247]> Sha (21.07.2010 12:21:06) [246]
Внутри которой непонятные функции и операции.
← →
Sha © (2010-07-21 12:28) [248]> Anatoly Podgoretsky © (21.07.10 12:26) [247]
Ждем. Виталий разъяснить должен.
← →
Alien1769 © (2010-07-21 12:58) [249]
> Alien1769, вы привели то, какие значения может принимать
> поле атрибута. Но в коде оно вообще не используется.
Ошибочное мнение. Как же функция узнает про каталог ?? :)
← →
Виталий © (2010-07-21 13:49) [250]
> что в IA-32 целые типы хранятся в Little Endian
Это читал в википедии.
> что Chr(i) эквивалентно Chr(Byte(i)) или Chr(i and 255),
Догадываюсь. В третьем случае поразрядное AND, а 255 - это 11111111, то есть число в итоге даст опять же i
> что после Shr 8 первый байт становится нулевым, второй -
> первым и т.д.,
> что после Shr 16 .........
- вероятно, третий - вторым, 4-й - третьим, ведь сдвиг вправо на 8 разрядов - это заполнение их (старших на х86) нулями, а то, что было младшими 8 разрядами, исчезнет.
-----------------------------------
Но в мою голову никак не приходит, как эти полезные знания использовать. А способ хранения длинных имен мне неясен. Откуда там эти 12 байт (6 юникод-символов)?
← →
Виталий © (2010-07-21 13:50) [251]
> Ошибочное мнение. Как же функция узнает про каталог ?? :
> )
Я имею ввиду про только эту рассматриваемую функцию.
← →
Виталий © (2010-07-21 13:53) [252]Ой, простите, не понял вас. Но там if Dir[I].Attr<>15, а 15 - это вообще что? $10 - это 16dec
← →
Anatoly Podgoretsky © (2010-07-21 13:54) [253]> Виталий (21.07.2010 13:49:10) [250]
Не совсем
Chr(256) и Chr(256 and 255) дадут разные результаты. Chr(I and 255) нужно
для выделения младшего байта, а Chr поддерживает и Юникод.
← →
Виталий © (2010-07-21 13:55) [254]
> Откуда там эти 12 байт
Подразумеваю, что в статье сказано о "дополнительной" каталоговой записи. Но в коде автор, по-моему, работает совсем не с ней.
← →
Виталий © (2010-07-21 13:58) [255]
> Chr(I and 255) нужно
> для выделения младшего байта, а Chr поддерживает и Юникод.
>
Понял вас, спасибо (проверил в калькуляторе и на бумаге работу).
← →
Sha © (2010-07-21 14:00) [256]> Виталий © (21.07.10 13:55) [254]
> Подразумеваю, что в статье сказано о "дополнительной" каталоговой записи.
> Но в коде автор, по-моему, работает совсем не с ней.
Да.
Не пытайся понять, что делает автор.
Выполни задание [234].
А там, глядишь, и поймешь.
← →
Виталий © (2010-07-21 14:03) [257]Как же я перепишу эту функцию, если мне неясен принцип ее работы?
← →
Sha © (2010-07-21 14:09) [258]> Виталий ©
> а 255 - это 11111111, то есть число в итоге даст опять же i
Нет. -1<>255, но chr(-1)=chr(255)
> Anatoly Podgoretsky © (21.07.10 13:54) [253]
> Chr поддерживает и Юникод.
В код функции написан задолго до юникодовой Chr,
там везде имеется в виду AnsiChr
← →
Виталий © (2010-07-21 14:11) [259]
>
> Нет. -1<>255, но chr(-1)=chr(255)
А вот это откуда узнать и так ли важна работа с отрицательными числами?
← →
Sha © (2010-07-21 14:14) [260]> Виталий © (21.07.10 14:03) [257]
> Как же я перепишу эту функцию, если мне неясен принцип ее работы?
Есть описание способа хранения длинного имени
http://www.ipm.kstu.ru/os/lec/13.php
этого достаточно, чтобы, (почти) не заглядывая в код чужой функции, написать свою.
Ведь ты же можешь написать код вычисления факториала,
не глядя на то, как это делают другие?
← →
Anatoly Podgoretsky © (2010-07-21 14:14) [261]> Виталий (21.07.2010 13:53:12) [252]
Dir[I].Attr<>15 это грубо, надо использовать именованые константы, а так это
набор флагов.
Смотри справку по FindFirst, а значение констант в файле windows.pas
← →
Sha © (2010-07-21 14:17) [262]> Виталий © (21.07.10 14:11) [259]
> А вот это откуда узнать и так ли важна работа с отрицательными числами?
А зачем тебе узнавать это?
Вот положительные
МахInt<>255, но chr(MaxInt)=chr(255)
511<>255, но chr(511)=chr(255)
← →
Anatoly Podgoretsky © (2010-07-21 14:18) [263]> Виталий (21.07.2010 14:03:17) [257]
Зачем тебе ее переписывать?
На чем ее переписывать, укажи точное название компилятора.
Принцип будет ясен, если изучить формат хранения длинных имен, за этим в
MSDN.
← →
Виталий © (2010-07-21 14:19) [264]
> этого достаточно, чтобы, (почти) не заглядывая в код чужой
> функции, написать свою.
Мне, к сожалению, недостаточно. Факториал написать проще. А тут, даже если я опишу эту "дополнительную" каталоговую запись, то у меня явно возникнет еще куча вопросов, и, что самое сложное, нужно еще будет написать немаленьку обертку типа той, что описана автором и в которой я совершенно ничего не понимаю.
← →
Виталий © (2010-07-21 14:21) [265]
> Зачем тебе ее переписывать?
дали же задание "удобочитаемо" ее переписать.
> На чем ее переписывать, укажи точное название компилятора.
У меня RAD Studio 2010. Вопрос лицензионности, прошу вас, отложите.
> Принцип будет ясен, если изучить формат хранения длинных
> имен, за этим в
> MSDN.
Есть подозрение, что он отличен от того хака, который сделан автором кода.
← →
Anatoly Podgoretsky © (2010-07-21 14:22) [266]> Sha (21.07.2010 14:09:18) [258]
Это так, но ты попробуй это на Д2010
А то что функция написана неверна, то это не является заслугой автора. Он
мог бы ее и правильно написать, хотя бы как предложено Chr(Byte(i)) или
Chr(i and 255)
← →
Виталий © (2010-07-21 14:22) [267]
> 511<>255, но chr(511)=chr(255)
все, что за пределами типа 0..255, становится равным тому, что вернется по коду 255?
← →
Anatoly Podgoretsky © (2010-07-21 14:23) [268]> Виталий (21.07.2010 14:11:19) [259]
А что ты тогда будешь делать если встретишь в чужом коде отричательные
числа, да в том же MSDN можно встретить и то и другое.
← →
Sha © (2010-07-21 14:25) [269]> А тут, даже если я опишу эту "дополнительную" каталоговую запись,
А ты попробуй.
> то у меня явно возникнет еще куча вопросов
Эти вопросы будут только по букварю.
> немаленьку обертку типа той, что описана автором
С чего взял? У автора немаленькая из-за его стремления экономить на описаниях.
А у тебя должно быть просто сцепление кусков.
> и в которой я совершенно ничего не понимаю.
А нафиг тебе это понимать до написания своего кода?
← →
Sha © (2010-07-21 14:26) [270]> все, что за пределами типа 0..255, становится равным тому, что вернется по коду 255?
chr(256)=chr(0)
← →
Виталий © (2010-07-21 14:28) [271]
> А что ты тогда будешь делать если встретишь в чужом коде
> отричательные
> числа, да в том же MSDN можно встретить и то и другое.
Тогда приду домой и попробую в книгах, которые мне порекомендовали здесь, найти поведение Chr, поскольку гугление ничего не дало.
> А ты попробуй.
Это я тоже попробую
Только затык с:
> С чего взял? У автора немаленькая из-за его стремления экономить
> на описаниях.
> А у тебя должно быть просто сцепление кусков.
Я имею ввиду все эти ассемблерные вставки и прочее.
← →
Anatoly Podgoretsky © (2010-07-21 14:30) [272]> Виталий (21.07.2010 14:21:25) [265]
Смею тебя огорчить, RAD не пишет программы под ДОС, а указаная программа
исключительно только под ДОС, на Виндоус она не нужна, да и замучаешься
использовать прерывания.
← →
Anatoly Podgoretsky © (2010-07-21 14:31) [273]> Виталий (21.07.2010 14:22:27) [267]
Нет CHR(Byte(256))
← →
Виталий © (2010-07-21 14:32) [274]
> chr(256)=chr(0)
Понял. Чтобы получить равенство, нужно проводить AND с 255. Получая младшие биты, имеем равенство. Наверное, c unicode-символами и большими кодами будет как-то иначе, поскольку там может получаться 2 и более младших бит.
← →
Anatoly Podgoretsky © (2010-07-21 14:33) [275]> Виталий (21.07.2010 14:28:31) [271]
Хорошо, тогда почему ты так не поступил, да хотя бы справку посмотрел бы,
при том для старой Дельфи и для Дельфи 2009+
← →
Виталий © (2010-07-21 14:34) [276]
> Смею тебя огорчить, RAD не пишет программы под ДОС
я догадался, но думаю, что какой-то способ написать подобное, считывая данные на низком уровне, должен быть и под Windows?
← →
Sha © (2010-07-21 14:35) [277]> Виталий © (21.07.10 14:21) [265]
> У меня RAD Studio 2010.
Тогда в этом коде используй
AnsiChr вместо Chr,
AnsiString вместо String.
> Я имею ввиду все эти ассемблерные вставки и прочее.
В функции GetUniLFN нету всех этих ассемблерные вставок и прочего.
Не хочешь писать - не морочь нам голову.
Но букварь все же лучше выучить наизусть.
← →
Виталий © (2010-07-21 14:38) [278]
> Хорошо, тогда почему ты так не поступил, да хотя бы справку
> посмотрел бы
Нету сейчас под рукой. А гугль молчит.
← →
Виталий © (2010-07-21 14:39) [279]
> Не хочешь писать - не морочь нам голову.
Если бы я не хотел писать и понимать, я бы не спрашивал все это. Я вижу, что в функции нету ассемблерных вставок. Но она - не вещь в себе. И ее надо будет откуда-то вызвать. А вызывается она у автора именно после всех подобных свистоплясок.
← →
Sha © (2010-07-21 14:44) [280]> И ее надо будет откуда-то вызвать.
Это просто учебный пример.
Напишешь подыгрывающую программу.
Страницы: 1 2 3 4 5 6 7 8 9
10 11 12 вся ветка
Форум: "Прочее";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];
Память: 1.07 MB
Время: 0.08 c