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

Поиск:

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


Эксперт
****


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

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



Вот, написал такой код
Код

function FileTimeToStr(ft:FILETIME):string;
var bytes:array[1..16] of byte absolute ft;
    i:integer;
begin
result:='';
for i:=1 to 16 do
 result:=result+char(ord('a')+bytes[i] shr 4)+' '+char(ord('a')+bytes[i] mod 240)+'    ';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var ft:filetime;
begin
GetSystemTimeAsFileTime(ft);
memo1.Lines.add(FiletimeToStr(ft));
end;

А выводит он сущую фигню. Помогите плиз найти ошибку 


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 5
Всего: 11



Я не разбирался с твоим кодом но САБЖ можно сделать так:
b - байт
Код

asm
  mov al, b
  and al, 00001111b  // выделяем младшие 4 бита
  mov ah, b
  and ah, 11110000b // выделяем старшие 4 бита
  shr ah, 4
end


в результате в al - младшие 4 байта, в ah - старшие
 
можно и без ассемблера обойтись:
Код

var
  b : byte;
  lo_, hi_ : byte;
begin
  b:=173;

  lo_:=b and $f;
  hi_:=b and $f0;
  hi_:=hi_ shr 4;
end
  

Это сообщение отредактировал(а) Coder - 30.5.2006, 04:06
PM MAIL   Вверх
Snowy
Дата 30.5.2006, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата
Из байта сделать два полубайта
Код

var
  bh, bl, b: byte;
begin
  b := xx; // чему-то равно
  bh := b shr 4 shl 4; // или просто shr, если нужно переместить верхние 4 в нижнюю часть
  bl := b shl 4 shr 4;
end;
  
PM MAIL   Вверх
Coder
Дата 30.5.2006, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 5
Всего: 11



Snowy, че-то ты намудрил.
надо так:
Код

bh := b shr 4;
bl := b shl 4;
bl:=bl shr 4;


если во втором случае сразу применить shl и shr то ВСЕ биты вернуться на свои места и при этом старшие не обратятся в нули 
PM MAIL   Вверх
Демо
Дата 30.5.2006, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 30
Всего: 50



Код

var    
  bh, bl, b: byte;    
begin    
  b := xx;
  bh := (b and $F0) shr 4;
  bl := b and $0F;    
end;
 


--------------------
    
PM MAIL ICQ Skype   Вверх
Snowy
Дата 30.5.2006, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Угу. Заметил - при выполнении операций, байт превращается в 4, потому и не получается.
Но лечится легко:
Код

var    
  bh, bl, b: byte;    
begin    
  b := xx; // чему-то равно    
  bh := b shr 4 shl 4; // или просто shr, если нужно переместить верхние 4 в нижнюю часть
  bl := byte(b shl 4) shr 4;
end;
 
PM MAIL   Вверх
Coder
Дата 30.5.2006, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 5
Всего: 11



Демо, не пому чем твой пример отличается от моего в первом ответе? в одну строку операторы and и shr не объединил что ли? smile 
PM MAIL   Вверх
Демо
Дата 30.5.2006, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 30
Всего: 50



Цитата(Coder @  30.5.2006,  09:10 Найти цитируемый пост)
Демо, не пому чем твой пример отличается от моего в первом ответе? в одну строку операторы and и shr не объединил что ли?


Отличается именно этим.
Пока досмотрел, про твой код и забыл.
Тебя что, задевает? 


--------------------
    
PM MAIL ICQ Skype   Вверх
Snowy
Дата 30.5.2006, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Тогда так будет самый оптимальный способ:
Код

  bh := b shr 4;
  bl := b and $F;
 
PM MAIL   Вверх
Mechanic
Дата 30.5.2006, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Coder @  30.5.2006,  08:57 Найти цитируемый пост)
bh := b shr 4;

Только не нужно это делать литералами прямо в коде!
Просто Delphi имеет глупую привычку заменять иногда при вычислении литералов shr на sar. 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Rennigth
Дата 30.5.2006, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



Цитата(Mechanic @  30.5.2006,  09:42 Найти цитируемый пост)
Просто Delphi имеет глупую привычку заменять иногда при вычислении литералов shr на sar.  

негде сейчас посмотреть, sar это что?
 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
bems
Дата 30.5.2006, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Спасибо, ребята, но это все и так понятно.
вот в этой моей строчке примерно то же самое и делаю
char('a'+bytes[i] shr 4)+' '+char('a'+bytes[i] mod 240)
но второй символ выходит за пределы латинского алфавита, а значить что bytes[i] mod 240 больше 16, чего быть не может. Может с этим absolute чего не так? или я уже не знаю...

Взгляните плиз на мой код, там не так уж много...

Цитата(Mechanic @  30.5.2006,  09:42 Найти цитируемый пост)
Просто Delphi имеет глупую привычку заменять иногда при вычислении литералов shr на sar
C этого моменто поподробнее

Добавлено @ 10:25 
Цитата(Coder @  30.5.2006,  08:57 Найти цитируемый пост)
если во втором случае сразу применить shl и shr то ВСЕ биты вернуться на свои места и при этом старшие не обратятся в нули  
Вот это тоже не ясно... Можно теоретические основы?
 


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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(bems @  30.5.2006,  03:28 Найти цитируемый пост)
function FileTimeToStr(ft:FILETIME):string;    
var bytes:array[1..16] of byte absolute ft;
Зачем тебе байты? string и так массив.
Кроме того по данной схеме, как я понимаю, получается, что bytes у тебя ссылается на указатель на строку, а не на саму строку. 
PM MAIL   Вверх
ShadeSt
Дата 30.5.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Может я чего то не понимаю, но

Код

The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601. 

typedef struct _FILETIME { // ft  
    DWORD dwLowDateTime; 
    DWORD dwHighDateTime; 
} FILETIME; 

64 бита, это вроде всего 8мь байт (получается, что последние 8мь байт в массиве - "неопределены"??).

а вот еще:
Код

The GetSystemTimeAsFileTime function is equivalent to the following code sequence:

FILETIME ft;
SYSTEMTIME st;
 
GetSystemTime(&st);
SystemTimeToFileTime(&st,&ft);


а с SYSTEMTIME все должно быть просто:
Код

typedef struct _SYSTEMTIME {  // st  
    WORD wYear; 
    WORD wMonth; 
    WORD wDayOfWeek; 
    WORD wDay; 
    WORD wHour; 
    WORD wMinute; 
    WORD wSecond; 
    WORD wMilliseconds; 
} SYSTEMTIME; 

Это по поводу того, как можно получить время, потом с помощью Format привести к нужному виду и потом добавить в memo. Может так проще будет, или инересен сам алгоритм получения строки из FileTime?

По поводу того, что выводит функция:
Код

result:='';    
for i:=1 to 16 do    
 result:=result+char(ord('a')+bytes[i] shr 4)+' '+char(ord('a')+bytes[i] mod 240)+'    ';

тут два символа и пять пробелов ( во втором случае их четыре), итого получится строка из 7*16=112 символов.
что делает этот код для меня, честно говоря загадка.

а как получить тетрады из байта, вроде уже написали.
 


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


Эксперт
****


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

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



Цитата(ShadeSt @  30.5.2006,  14:42 Найти цитируемый пост)
64 бита, это вроде всего 8мь байт (получается, что последние 8мь байт в массиве - "неопределены"??).

SizeOf(DWORD)+SizeOf(DWORD) = 8
8 * 8 = 64
Какие последние 8 байт? (Я что то недопонимаю? smile)  

Это сообщение отредактировал(а) Yanis - 30.5.2006, 13:51


--------------------
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.2106 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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