информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] или так: 09.04.03 15:00  Число просмотров: 1011
Автор: FFF Статус: Незарегистрированный пользователь
<"чистая" ссылка>
смотрю число $3E после вырывания
> должно получиться $F, а получается у меня $3E, как и было

не очень понял про "вырывание" -- раньше шла речь о конвертации бита. А для этого надо использовать XOR, а не OR.
<programming>
[Win32] как на delphi реализовать этот механизм 09.04.03 12:49   [ZloyShaman]
Автор: Helmet Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Есть байт, из него нужно выдрать первые 6 битов отдельно и последние
2 бита отдельно, то-есть,

Байт: 00111110
мне нужны 001111
и 10 отдельно,мне надо из одного байта сделать два...
-> beginners 09.04.03 12:59  
Автор: ZloyShaman <ZloyShaman> Статус: Elderman
<"чистая" ссылка>
> Есть байт, из него нужно выдрать первые 6 битов отдельно и
> последние
> 2 бита отдельно, то-есть,
>
> Байт: 00111110
> мне нужны 001111
> и 10 отдельно,мне надо из одного байта сделать два...
сделай AND с 11111100 для первых 6 бит и с 00000011 для последних 2-ух.
[Win32] Хм... 09.04.03 13:35  
Автор: Helmet Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > Есть байт, из него нужно выдрать первые 6 битов
> отдельно и
> > последние
> > 2 бита отдельно, то-есть,
> >
> > Байт: 00111110
> > мне нужны 001111
> > и 10 отдельно,мне надо из одного байта сделать два...
> сделай AND с 11111100 для первых 6 бит и с 00000011 для
> последних 2-ух.
Байт может быть другим (разные байты)

Хорошо поставлю вопрос так :
Как мне менять определенные биты в байте,
то-есть проверить какое значение опеределенного бита и поменять его...
[Win32] Хм... 09.04.03 13:42  
Автор: ZloyShaman <ZloyShaman> Статус: Elderman
<"чистая" ссылка>
> > > Есть байт, из него нужно выдрать первые 6 битов
> > отдельно и
> > > последние
> > > 2 бита отдельно, то-есть,
> > >
> > > Байт: 00111110
> > > мне нужны 001111
> > > и 10 отдельно,мне надо из одного байта сделать
> два...
> > сделай AND с 11111100 для первых 6 бит и с 00000011
> для
> > последних 2-ух.
> Байт может быть другим (разные байты)
Да, совершенно верно - байты бывают разные. Но, я надеюсь, общий принцип ты уловил.
> Хорошо поставлю вопрос так :
> Как мне менять определенные биты в байте,
> то-есть проверить какое значение опеределенного бита и
> поменять его...
Пример, как поменять пятый бит в байте на 1:
нужно твой байт OR с 0000100
[Win32] Хм... 09.04.03 14:14  
Автор: Helmet Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Блин... Я понимаю это... Но это реально делать на asm там есть возможность работать в двоичном формате, а в Delphi, как это сделать?

К примеру может ли этот код проверить какой-то бит на 1 :

function IsBit (const val : integer; const Bit:byte):boolean;
begin
result:=(val and ( 1 shl Bit ))<>0;
end;

если да то,

я получил что 5 бит в байте равен 1, мне надо его поменять на 0,

не могу же я в delphi написать:

z:=z or 00001000;

а код
z:=z or (1 shl 4);

не меняет нифига.......
[Win32] или так: 09.04.03 14:02  
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman
<"чистая" ссылка>
> Да, совершенно верно - байты бывают разные. Но, я надеюсь,
> общий принцип ты уловил.

> Пример, как поменять пятый бит в байте на 1:
> нужно твой байт OR с 0000100

Если так не понятно, то, возможно, для начала проще будет пойти через десятичное представление?

Имеем:
00000000 <=> 0
00000001 <=> 1
00000010 <=> 2
00000011 <=> 3
и т.д...

тогда просто получая десятичное представление байта будешь иметь представление о его содержимом и о том, какое значание он должен иметь, чтобы n-й бит был другим.

И вообще, советую изучить алгоритм перевода из десятичной в двоичную и обратно - много вопросов сразу отпадет.
[Win32] или так: 09.04.03 14:28  
Автор: Helmet Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> И вообще, советую изучить алгоритм перевода из десятичной в
> двоичную и обратно - много вопросов сразу отпадет.
Я прекрасно знаю эти алгоритмы и методом деления и методом возведения в степень... Не суть... Я пишу на Delphi, на асме правильно подставил маску и or сделал и все ОК, на делфи минимальная единица byte.... Я могу творить с ним логические операции, но как достучаться до опеределенного бита, у меня лажа получается... Запускаю калькулятор стандартный виндовый, смотрю число $3E после вырывания должно получиться $F, а получается у меня $3E, как и было Вот исходник:
//..............//

var
b,k,z,l:byte;
begin
b:=$3E;
showmessage(inttohex(b,2));
z:=0;
for k:=0 to 7 do
if (b and (1 shl k)) <> 0 then
z:=b or (1 shl k);

showmessage(inttohex(z,2));

//..............//
[Win32] или так: 09.04.03 15:13  
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman
Отредактировано 09.04.03 15:16  Количество правок: 1
<"чистая" ссылка>
Если хочешь получить FF, то алгоритм должен выглядеть вот так:

//..............//

var
b,k,z:byte;
begin
b:=$3E;
showmessage(inttohex(b,2));
z:=0;
for k:=0 to 7 do
if (b and (1 shl k)) = 0 then
z:=z or (b or (1 shl k));

showmessage(inttohex(z,2));

//..............//

тогда z=$FF.
просто нужно учитывать накопление битов, что мы и делаем после then,
а также правильно надо задать условие (=0, а не <>0)
[Win32] или так: 09.04.03 15:00  
Автор: FFF Статус: Незарегистрированный пользователь
<"чистая" ссылка>
смотрю число $3E после вырывания
> должно получиться $F, а получается у меня $3E, как и было

не очень понял про "вырывание" -- раньше шла речь о конвертации бита. А для этого надо использовать XOR, а не OR.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach