Форум: "Основная";
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];
ВнизПомогите разобраться с протоколом... Найти похожие ветки
← →
dimonf (2002-03-20 21:35) [0]Господа программисты помогите чайнику :)
Я никак не могу разобраться с протоколом.
У меня есть данные в виде: 4D E6 4A
Где:
4D - Старший байт - порядок числа со смещение 40h.
Если старший бит равен единице, то число отрицательное
E6 - Средний байт - старший байт приведенной мантиссы
4A - Младший байт - младший байт приведенной мантиссы.
Н.п. 40h 80h 00h равно 0.5
41h 80h 00h равно 1
По протоколу 4D E6 4A это 7369,25 все правильно.
Но 50 A0 DF должно получиться 41183.0 а у меня получается -24353
Почем такие глюки или я чего ни будь, не понимаю?
Вот мой код преобразования:
type
TByte=array[1..3] of byte;
function TMainForm.GetFloat(a:TByte):single;
var tmpA:word;
tmpAA:array[1..2] of byte absolute tmpA;
shift:byte;
begin
tmpAA[1] := a[3];
tmpAA[2] := a[2];
shift:=a[1]-$40;
IF shift=$00 then result:=tmpA/$10000
else result:=(tmpA shl shift)/$10000;
end;
var A : TByte;
A[1] := [$50];
A[2] := [$A0];
A[3] := [$DF];
← →
MBo (2002-03-21 08:19) [1]function GetFloat(a:TByte):single;
var tmp:Cardinal;
Sign,shift:byte;
begin
Tmp:=((a[2] shl 8) or a[3]);
Sign:=a[1] shr 7;
shift:=a[1]-$40;
result:=(tmp shl shift)/$10000;
if Sign=1 then result:=-Result;
end;
← →
MBo (2002-03-21 08:32) [2]в принципе, и переменные локальные не нужны, но с ними яснее
result:=((Integer(a[1]<$80) shl 1)-1)*
(Cardinal(((a[2] shl 8) or a[3]) shl (a[1]-$40))/$10000);
>Если старший бит равен единице, то число отрицательное
неясно - все число или порядок?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];
Память: 0.44 MB
Время: 0.005 c