Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2008, 17:59   #1
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию Бинарные данные в delphi

Я что-то не нашёл в delphi типов, работающих с бинарными числами.
Пришлось сделать так.

Код:
Type
 TBinary = String;

Function IntToBin(int:integer):TBinary;
var i:integer;
    Ost:string;
begin
if int < 1 then        //=<
 Result:=inttostr(int)
else
 while int > 1 do
  begin
   ost:=inttostr(int mod 2)+ost;
   int:=int div 2;
  end;
Result:=inttostr(int)+ost;
end;
Однако уткнулся в проблему: строку "1010010100101011000100010100101011 01000000000111011010111" никак не перевести ни в integer, ни в cardinal

Выходом из проблемы станет функция преобразования из bin в integer
Однако здесь я в тупике... помогите кто чем сможет.

Заранее благодарю.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 24.05.2008, 18:04   #2
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Всё просто:
1. Считаем количество цыфр.
2. Есть 1 то плюсуем степень.

Код:
result:=0;
strlen:=length(str);
for n:=1 to strlen do begin
  if str[strlen-n+1]:='1' then result:=result+power(2,n-1);
end;
Вроде так)))

То есть
2^0=1 первый бит
2^1=2 второй бит
2^2=4 третий бит
....
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг

Последний раз редактировалось Dj_smart; 24.05.2008 в 18:12.
Dj_smart вне форума Ответить с цитированием
Старый 24.05.2008, 18:12   #3
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Работает, спасибо большое.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 24.05.2008, 18:12   #4
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Незачто, ведь на то он и форум)))
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 29.01.2009, 15:54   #5
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

У меня такой вопрос. Есть в реестре параметр типа REG_BINARY
Я его читаю так:
Код:
var
  reg : TRegistry;
  buf : array [0..19] of char;
begin
  reg := TRegistry.Create;
  reg.RootKey := HKEY_LOCAL_MACHINE;
  reg.OpenKey('Тут ключ', false);
  reg.ReadBinaryData('Параметр', Buf, SizeOf (buf));
  reg.CloseKey;
  reg.Free;
Знаю что там точно содержится строка.
Как мне получить эту строку типа String?
FaTaL вне форума Ответить с цитированием
Старый 29.01.2009, 16:01   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Buf - кусок памяти в 20 байт (чаров)
String - указатель на кусок памяти, в не ограниченое кол-во байт (чаров)

Дельфи интерпритирует еще проще String(buf) все

ВАЖНО если размер ключа 20 байт, то надо сделать размер buf = 21 и забить 21 байт нулем. Т.к. строка - это кусок памяти заканчивается строка такая нулем.

Или еще проще, сразу перед считыванием пишите FillChar(buf, sizeof(buf), 0); Но надо точно знать, что размер buf > чем размер считанных данных т.е.

reg.ReadBinaryData('Параметр', Buf, SizeOf (buf) -1);
BOBAH13 вне форума Ответить с цитированием
Старый 30.01.2009, 10:55   #7
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Buf - кусок памяти в 20 байт (чаров)
String - указатель на кусок памяти, в не ограниченое кол-во байт (чаров)

Дельфи интерпритирует еще проще String(buf) все

ВАЖНО если размер ключа 20 байт, то надо сделать размер buf = 21 и забить 21 байт нулем. Т.к. строка - это кусок памяти заканчивается строка такая нулем.

Или еще проще, сразу перед считыванием пишите FillChar(buf, sizeof(buf), 0); Но надо точно знать, что размер buf > чем размер считанных данных т.е.

reg.ReadBinaryData('Параметр', Buf, SizeOf (buf) -1);
Есть такая ветка реестра:
Код:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\111\]
"Test"=hex:0b,d6,e7,e9,bf,f0,c3,f2,3d,64,5e,ad,cf,c8,61,75,87,31,13,bc
Как из неё извлеч данные, чтобы получилась строка
j3b8fkxxk8
Там точно эта строка есть и проги её как то получают из этих данных, но мне нужно реализовать это самому программно.
Помогите кто можите
Заранее благодарен.
FaTaL вне форума Ответить с цитированием
Старый 30.01.2009, 11:08   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Что-то я не понял, я же написал, дал ответ. Вам лень думать ?
BOBAH13 вне форума Ответить с цитированием
Старый 30.01.2009, 11:17   #9
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Что-то я не понял, я же написал, дал ответ. Вам лень думать ?
Попробывал, но он что-то не то выдает совсем. Левые какие то символы. Может кините примерчик? Буду премного благодарен.
Вот так я сделал:
Код:
var
  reg : TRegistry;
  buf : array [0..21] of char;
begin
  FillChar (buf, SizeOf (buf), 0);
  reg := TRegistry.Create;
  reg.RootKey := HKEY_LOCAL_MACHINE;
  reg.OpenKey('SOFTWARE\111', false);
  reg.ReadBinaryData('Test', buf, SizeOf (buf)-1);
  reg.CloseKey;
  reg.Free;
end;
А дальше как получить мне нужную строку, которая должна быть
j3b8fkxxk8

Последний раз редактировалось FaTaL; 30.01.2009 в 11:32.
FaTaL вне форума Ответить с цитированием
Старый 30.01.2009, 14:42   #10
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Дельфи интерпритирует еще проще String(buf) все
Не понятно что вы пробывали. Я понимаю что пусть другие будут делать за вас все, это очень удобно. Ну да ладно, раз вы не проявляите желания понять и вчитатся, то вопрос:

С каких соображений вы полчили это "j3b8fkxxk8" из "0b,d6,e7,e9,bf,f0,c3,f2,3d,64,5e,a d,cf,c8,61,75,87,31,13,bc"

Т.к. я не поленился и ввел эти байты в хекс редакторе и увидел вот что:
"ЦзйїрГт=d^*ПИau‡1ј" где тут та строка я не пойму. И не уникод это вроде, т.к. языковый байт не повторяется, может кодировка какая, или еше что-то, может зашифровано, или зжато, извените но я не экстрасенс
И еще вопрос, если вы знаите что будет получена строка "j3b8fkxxk8" зачем тогда вообще ее читать ?

Задача сделана типа: получить золото из алюминия, как ?
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарные деревья Влдислаав3911 Помощь студентам 2 21.05.2008 23:39
Delphi:обновить данные в таблице. Raccoon Помощь студентам 5 19.05.2008 19:31
Бинарные деревья в С++ Go6a Помощь студентам 1 24.04.2008 16:31
бинарные деревья. ribka Помощь студентам 2 30.11.2007 18:13