Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.04;
Скачать: CL | DM;

Вниз

Перевести значение из BCD в integer   Найти похожие ветки 

 
Oni   (2005-11-19 15:27) [0]

Вопрос такой - есть значение, длиной в 8 бит, в формате BCD. Необходимо перевести его в integer.Как это сделать применительно к Дельфи - непонятно


 
begin...end ©   (2005-11-19 15:29) [1]

В каком оно формате? Есть упакованные и неупакованные BCD-числа.


 
Oni   (2005-11-19 16:21) [2]

Не упакованное.

Вот к примеру 24 байта массива содержащего разные значения:

16_149_132_89_3_0_0_0 » 8 байт - от младшего к старшему = значение.
128_5_0_0_0_0_0_0       » следующие байты хранящие значение
16_20_102_65_0_0_0_0  » следующие байты...


 
heh   (2005-11-19 16:35) [3]

Oni   (19.11.05 15:27)
Обычно BCD каждая десятичная цифра кодируется 4-мя битами, т.е. в одном байте можно закодировать две цифры или число 0..99. Проверить такое ли у тебя BCD просто - в Windows калькуляторе введи это число и преобразуй в режим "hex"


 
begin...end ©   (2005-11-19 17:48) [4]

> Oni   (19.11.05 16:21) [2]

Не понял я. Если бы формат был неупакованным, то среди значений байтов не встречались бы числа, превышающие 9.


 
heh   (2005-11-19 18:27) [5]

>превышающие 9
153, 9*16+9 = 153


 
begin...end ©   (2005-11-19 18:39) [6]

> heh   (19.11.05 18:27) [5]

К чему это? В [4] речь про неупакованный формат, а в Вашем примере -- упакованный.


 
heh   (2005-11-19 18:52) [7]

[6] begin...end ©   (19.11.05 18:39)
В чём ваша цель? В посте [2] видно, с чем имеет дело автор.


 
begin...end ©   (2005-11-19 18:58) [8]

> heh   (19.11.05 18:52) [7]

Я просто не понял, почему [5] последовало в ответ на [4]. По [2] видно, что упакованный, но автор говорит об обратном.

Если всё же действительно упакованный, то могу посоветовать автору функцию BCDToInteger из модуля FmtBCD.


 
Oni   (2005-11-19 19:15) [9]

Чесно сказать, я сам сомневаюсь что он неупакованный :)


 
Oni   (2005-11-19 22:39) [10]

А модуль FmtBCD я у себя не нашел. Использую Delphi 5.


 
Германн ©   (2005-11-20 02:21) [11]

2 begin...end ©   (19.11.05 18:58) [8]

Я бы лично, не советовал бы автору применять никакие функции, пока он не скажет откуда он берет "значение, длиной в 8 бит, в формате BCD"!
Тем более, что в формате BCD могут быть записаны и не Integer значения.


 
Oni   (2005-11-20 03:00) [12]

Значения берутся от программы, опрашивающей электрические счётчики.Значения числовые и не дробные.Т.е. тип может быть и Long64. Мне бы принцип перевода узнать. Или, хотя-бы, где копать.


 
Oni   (2005-11-20 03:00) [13]

Пардон, не Long64, а Int64


 
Германн ©   (2005-11-20 03:43) [14]

Так. А что ты знаешь об этой программе? Что и как она передает?


 
begin...end ©   (2005-11-20 11:41) [15]

> Германн ©   (20.11.05 02:21) [11]

> Я бы лично, не советовал бы автору применять никакие функции,
> пока он не скажет откуда он берет "значение, длиной в 8
> бит, в формате BCD"!

И чем Вам поможет, скажем, название программы, из которой берётся это значение?

> Тем более, что в формате BCD могут быть записаны и не Integer
> значения.

В посте [0] чёрным по белому написано, что значение целое.

> Oni   (19.11.05 19:15) [9]

А зачем тогда было говорить, что он неупакованный? Мы же хотим помочь, а Вы нас зачем-то в заблуждение вводите.
:-)

> Oni   (19.11.05 22:39) [10]

Да, в Delphi 5 нет этого модуля. Значит, надо ручками делать. Только если бы изначально было сказано, какая версия Delphi используется, то вопрос был бы уже решён.
:-)

> Oni   (20.11.05 03:00) [12]
> Мне бы принцип перевода узнать.

В упакованном BCD каждый полубайт содержит одну десятичную цифру. А каждый байт, таким образом, содержит 2 десятичные цифры. Например, пусть значение байта равно 149. Запишем это в двоичном виде (можно использовать калькулятор Windows): 1001 0101. Младший полубайт -- это 5, а старший -- это 9. Значит, было закодировано число 95.

Ещё легче переводить, если представить исходный байт сразу в шестнадцатеричном виде. Каждая шестнадцатеричная цифра, как известно, представляет один полубайт. А поскольку в каждом полубайте закодирована одна десятичная цифра (т.е. значение полубайта не превышает 9), то шестнадцатеричное представление совпадает с десятичным закодированным числом. Переводим 149 в HEX: $95, и сразу видим, что изначально было число 95.

Теперь разберём, например, первые 8 байт из [2]:

DEC:  16  149  132   89    3    0    0    0

HEX: 1 0  9 5  8 4  5 9  0 3  0 0  0 0  0 0


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

Вот код, который может сделать такое преобразование:

type
 TBCD = array [1..8] of Byte;
const
 BCD: TBCD = (16, 149, 132, 89, 3, 0, 0, 0);
var
 Value, Base: Int64;
 I: Integer;
begin
 Value := 0;
 Base := 1;
 for I := Low(BCD) to High(BCD) do
 begin
   Value := Value + Base * (BCD[I] and $0F) + Base * 10 * (BCD[I] shr 4);
   Base := Base * 100;
 end;
 ShowMessage(IntToStr(Value))
end


Впрочем, можно и так:

Value := StrToInt64(IntToHex(Int64(BCD), 8))

:-)

Что печально -- не обязательно, что BCD-числа будут располагаться по принципу "младший байт по младшему адресу". Программист зачастую может сам решать, как ему удобнее.

P.S. Только почему-то изначально говорилось о числах из 8 бит, а уже в [2] -- о числах из 8 байт.
:-)


 
Anatoly Podgoretsky ©   (2005-11-20 12:03) [16]

Еще много тайн скрыто от нас, при том они имеют тенденцию двигаться в разные стороны и неоднакратно.
Чем дальше в лес, тем толще партизаны.


 
Anatoly Podgoretsky ©   (2005-11-20 12:05) [17]

8 бит преобразовываются легко
Int := (N shr 4) * 10 + (N and $0F)


 
Oni   (2005-11-20 12:29) [18]

Господа, простите великодушно, в первый пост вкралась непростительная очепятка не 8 бит а 8 байт



Страницы: 1 вся ветка

Текущий архив: 2005.12.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.045 c
14-1130325473
Сергей1981
2005-10-26 15:17
2005.12.04
Чтение файлов MSWord


2-1132166129
Vladik
2005-11-16 21:35
2005.12.04
kill thread


1-1131190336
_Sergey_
2005-11-05 14:32
2005.12.04
Удаление выделенных узлов TreeView


6-1125327416
VadimX
2005-08-29 18:56
2005.12.04
WinSock SEND,RECV слепляются команды


1-1131520491
Piero
2005-11-09 10:14
2005.12.04
Handle формы приложения, после запуска его WinExec