Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Из байта сделать два полубайта, НИЧЕГО НЕ ПОНИМАЮ!! 
:(
    Опции темы
bems
Дата 30.5.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(Snowy @  30.5.2006,  10:43 Найти цитируемый пост)
Зачем тебе байты? string и так массив.

Нужны байты FILETIME
Цитата(ShadeSt @  30.5.2006,  13:42 Найти цитируемый пост)
64 бита, это вроде всего 8мь байт (получается, что последние 8мь байт в массиве - "неопределены"??).
Так просчитаться - это задница. Но ничего не поделаешь, все уже это видели. smile Конечно же я имел ввиду 8. Но в результате этой ошибки суть проблемы не меняется.

Цитата(ShadeSt @  30.5.2006,  13:42 Найти цитируемый пост)
можно получить время, потом с помощью Format привести к нужному виду и потом добавить в memo. Может так проще будет, или инересен сам алгоритм получения строки из FileTime?
Именно так.

Цитата(ShadeSt @  30.5.2006,  13:42 Найти цитируемый пост)
что делает этот код для меня, честно говоря загадка.

попытаюсь прояснить.
Код

function FileTimeToStr(ft:FILETIME):string;//ради отладки этой функции и нужен остальной код
var bytes:array[1..8] of byte absolute ft;//исправляем на 8. спасибо
    i:integer;
begin
result:='';
for i:=1 to 8 do
 result:=result+char(ord('a')+
  bytes[i] shr 4 //старшие 4 бита получаю нормально. Добавляю это значение к началу алфавита
//и получаю символ, не выходящий за пределы алфавита. Так и должно быть
  )+' '+char(ord('a')+
  bytes[i] mod 240//тут пытаюсь получить младшие 4 бита. Когда добавляю это значение
//к началу алфавита, то почему-то получаю не алфавитные символы или русаские буквы.
//в этом и проблема
  )+'    ';
end;

Цитата(ShadeSt @  30.5.2006,  13:42 Найти цитируемый пост)
тут два символа и пять пробелов ( во втором случае их четыре), итого получится строка из 7*16=112 символов.
пробелы для наглядности.
цель получить строку латинских букв
 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
ShadeSt
Дата 30.5.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 9.8.2005
Где: Россия, г. Ставро поль

Репутация: нет
Всего: 7



Цитата

Какие последние 8 байт? (Я что то недопонимаю? )  


Код

function FileTimeToStr(ft:FILETIME):string;    
var bytes:array[1..16] of byte absolute ft;

восемь байт с 9го по 16й.  

Это сообщение отредактировал(а) ShadeSt - 30.5.2006, 14:31


--------------------
It's nice to be importand, but it's more importand to be nice © Scooter
PM MAIL ICQ Jabber   Вверх
Yanis
Дата 30.5.2006, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(ShadeSt @  30.5.2006,  15:30 Найти цитируемый пост)
восемь байт с 9го по 16й.  

А ты про это! Понял smile 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
ShadeSt
Дата 30.5.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 9.8.2005
Где: Россия, г. Ставро поль

Репутация: нет
Всего: 7



Дело в том, что ошибка в этой строке:
Цитата(bems @  30.5.2006,  14:11 Найти цитируемый пост)
 bytes[i] mod 240//тут пытаюсь получить младшие 4 бита. Когда добавляю это значение

например: 50 Mod 240 = 50, т.к. остаток от деления равен пятидесяти, попробуй написать так, как советовали выше, например так:
Код

begin
result:='';
  for i := 1 to 8 do
    Result := Result + chr(ord('a') + (bytes[i] shr 4  )) + ' ' +
                       chr(ord('a') + (bytes[i] and $0F)) + '    ';
end;

 


--------------------
It's nice to be importand, but it's more importand to be nice © Scooter
PM MAIL ICQ Jabber   Вверх
bems
Дата 30.5.2006, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Mod 240 - это вариант, когда я уже отчаился. Тут еще раз прогнал, это понятно. Как советовали выше (and $0F), сделал и заработало, спасибо.

Волнует вот что. До этого было ((bytes[i] shl 4  ) shr 4) и не работало, хотя по логике вещей должно, и выше писали то же самое. Кто-нить может это объяснить? 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
ShadeSt
Дата 30.5.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 9.8.2005
Где: Россия, г. Ставро поль

Репутация: нет
Всего: 7



ИМХО при выполнении 
Код

  (bytes[i] shl 4) shr 4

дельфи, по всей видимости приводит результат операции (bytes[i] shl 4)
к типу Integer, и поэтому получается , что результат не меняется.
можно делать так:
Код

  byte(bytes[i] shl 4) shr 4

для явного приведения типа, либо так:
Код

  (bytes[i] shl 28) shr 28

для того, что бы вылезти за границу Integer'а


 


--------------------
It's nice to be importand, but it's more importand to be nice © Scooter
PM MAIL ICQ Jabber   Вверх
ShadeSt
Дата 30.5.2006, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 9.8.2005
Где: Россия, г. Ставро поль

Репутация: нет
Всего: 7



Вот. я нашел, я просто разул глаза и посмотрел справку:
Код

Operator    Operation    Operand types    Result type    Examples
shl    bitwise shift left    integer    integer    X shl 2
shr    bitwise shift right    integer    integer    Y shr I

т.е. тут операнды сразу приводятся к типу Integer, поэтому такое, на первый взгляд странное поведение.  


--------------------
It's nice to be importand, but it's more importand to be nice © Scooter
PM MAIL ICQ Jabber   Вверх
bems
Дата 30.5.2006, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



спасибочки 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Guedda
Дата 31.5.2006, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



А если сделать просто:
Код

var
  bh, bl : Byte;
begin
  asm
    mov  byte ptr bh, ah
    mov  byte ptr bl, al
  end;
end;

Как я понимаю в ah хранятся старшие 4 бита, а в al - младшие. Просто их кинуть в переменные, да и всё тут )
Если не правильно, поясните. 


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Yanis
Дата 31.5.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Guedda
Нужно получить именно эти bh и bl, на сколько я понимаю smile 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Mechanic
Дата 31.5.2006, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Цитата(Rennigth @  30.5.2006,  10:21 Найти цитируемый пост)
негде сейчас посмотреть, sar это что?


Цитата(bems @  30.5.2006,  10:21 Найти цитируемый пост)
C этого моменто поподробнее


sar - почти тот же shr, только с сохранением старшего бита (арифметический сдвиг), для корректной работы с отрицательными значениями.
Так вот, если написать
Код

//a: integer;
a := -7 shr 1;
Что должно получиться?  smile Ни за что не угадаете..
 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Guedda
Дата 31.5.2006, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Цитата(Mechanic @  31.5.2006,  12:06 Найти цитируемый пост)
Что должно получиться?  smile Ни за что не угадаете..

Получится 3. 


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Yanis
Дата 31.5.2006, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Нека, -4 smile  

Это сообщение отредактировал(а) Yanis - 31.5.2006, 16:56


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Mechanic
Дата 31.5.2006, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Точно, -4.. smile

    11111111111111111111111111111001 = -7

По идее, должно быть
    01111111111111111111111111111100 = 2147483644

но имеем
    11111111111111111111111111111100 = -4

Но если сделаем
Код

a := -7;
a := a shr 1;

Тогда все считается кардинально наоборот!  smile  
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Yanis
Дата 1.6.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Mechanic @  1.6.2006,  00:33 Найти цитируемый пост)
Тогда все считается кардинально наоборот!

Да. Странно, что в первом случае считается некорректно.
Код
Shifts the destination right by "count" bits with zeroes shifted in on the left.  The Carry Flag contains the last bit shifted out.

smile  

Это сообщение отредактировал(а) Yanis - 1.6.2006, 11:26


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1469 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.