Войти

Показать полную графическую версию : *Теория* | Как работать с двоичными данными?


Hijri
12-07-2006, 00:34
помогите!!!!!! ни как не могу понять как работать с двоичными данными, например хочу конвертировать из двоичных данных в шеснатитиричные воспользовался борландской процедурой bintohex результат совсем не тот.

Gerdewski
12-07-2006, 11:58
А какой результат нужен? Поподробней пожалуйста.

bezumes
12-07-2006, 14:49
Вообще нас в институте учили так чтобы перевести Ч2 в Ч16 надо взять число, например, 11011(в двоичной)и разделить её на тетрады справа на лево(по четыре элемента)если в крайней левой нехватает цифер дополнить нулями затем каждую тетраду записать в 16 числами. например число 11011-получается левая тетрада 0001 правая 1011-отсюда разлогая по разрядам первую тетраду там понятно что 1 вторую 1 +(1+1)+(0)+(1+1+1+1+1+1+1+1)=11 что есть B(в 16)затем пишем что получилось от первой тетрады слева а то что получилось от правой справо и получаем 1B

sandycrazy
12-07-2006, 20:58
готовые процедуры врядли есть.. проще самому ручкам написать, "bezumes" написал как))

Hijri
12-07-2006, 23:38
например в двочном формате "1111" в шеснацатиричном будет "F" у меня получается 313500 не могу понять как действует это процедура BINTOHEX обьясните пожалуйста

bezumes
13-07-2006, 10:25
нашел с помощью рамблера может поможет
Из двоичной в шестнадцатеричную (BinToHex)
1. Далеко не самый оптимальный способ, зато наглядно демонстрирующий алгоритм конвертирования из двоичного представлением числа в шестнадцатеричную: исходная строка разбивается на тетрады (части по 4 символа) и заменяется на соответствующие им элементарные шестнадцатеричные числа.

function BinToHex(const BinStr: string): string;
const BS: array[0..15] of string[4] =
(?0000?,?0001?,?0010?,?0011?,?0100?,?0101?,?0110?,?0111?,?1000?,?1001?,
?1010?,?1011?,?1100?,?1101?,?1110?,?1111?);
HS: array[0..15] of Char = (?0?,?1?,?2?,?3?,?4?,?5?,?6?,?7?,?8?,?9?,
?A?,?B?,?C?,?D?,?E?,?F?);
var s,h: string;
i: integer;
Err: boolean;
begin
Result := ??;
s := BinStr;
if (s[Length(s)] = ?b?) or (s[Length(s)] = ?B?) then
Delete(s, Length(s), 1);
// дополнение строки нулями, пока ее длина не кратна 4
while (Length(s) mod 4) <> 0 do s := ?0? + s;
while Length(s) > 0 do
begin
Err := true;
h := Copy(s,1,4);
Delete(s,1,4);
for i := 0 to 15 do
if h = BS then
begin
Result := Result + HS;
Err := false;
break;
end;
if Err then
begin
Result :=??????;
Exit;
end;
end;
end;

А так эту задачу решили программисты Borland (модуль Classes):
procedure BinToHex(Buffer, Text: PChar; BufSize: Integer);
const
Convert: array[0..15] of Char = ?0123456789ABCDEF?;
var
I: Integer;
begin
for I := 0 to BufSize - 1 do
begin
Text[0] := Convert[Byte(Buffer[I]) shr 4];
Text[1] := Convert[Byte(Buffer[I]) and $F];
Inc(Text, 2);
end;
end;
Hijri Ну че получилось? если нет выложи свой код

Hijri
14-07-2006, 00:18
как действует первый код я знаю меня интересует борландский вариант вот мой код
var
b:array[byte] of char;
t:array[byte] of char;
begin
b:='';t:='';
StrpCopy(b,edit1.Text);
bintohex(b,t,sizeof(b));
label1.Caption:=t;




© OSzone.net 2001-2012