PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Подскажите алгоритм декодирования


Подскажите алгоритм декодирования

Сообщений 1 страница 3 из 3

1

есть последовательность байтов переменной длины от 1 до 4 в которой закодировано Integer32

Первый байт - старший, последний - младший.
Первый бит старшего байта - знак.

Имеем адрес начала последовательности *mem и длину последовательности nLength.l

Нужно преобразовать в обычный пуриковский Result.l он же long.

Пару лет назад я написал функцию декодирования и успешно пользовался ею.
Пока недавно не выяснил что она неправильно декодирует отрицательные числа.
Я конечно исправил. Но мне не очень нравится мой алгоритм - очень специфичен.

Может кто предложит более "красивый" алгоритм.
Свой алгоритм пока не публикую чтобы не сбивать с собственных идей.

0

2

Это нужно?

Код:
Procedure.l ReverseLong(Var.l)
  Protected Result.l
  Protected *Source, *Destination
  
  *Source = @Var
  *Destination = @Result
  PokeB(*Destination  ,PeekB(*Source+3))
  PokeB(*Destination+1,PeekB(*Source+2))
  PokeB(*Destination+2,PeekB(*Source+1))
  PokeB(*Destination+3,PeekB(*Source))
  
  ProcedureReturn Result
EndProcedure

0

3

Байтов не всегда четыре.
Раньше у меня было так (число начинается с *mem+2)

Код:
	; узнать знак числа (+/-)
	If ( PeekB(*mem+1+1) & $80 ) ; бит минусового числа
	  minus=$80000000
	EndIf
	result=0
	For i=1 To nLength
	  result<<8
	  ;result|PeekB(*mem+1+i)
	  result+(PeekB(*mem+1+i)&$ff)
	Next i
	*result\l = result | minus ; прописат знак числа

Потом применил ту же идею с подстановкой байтов

Код:
	; узнать знак числа (+/-)
	If ( PeekB(*mem+1+1) & $80 ) ; бит минусового числа
	  result=$FFFFFFFF
	EndIf
	
	For i=1 To nLength
	  PokeA(@result+i-1,PeekA(*mem+2+nLength-i))
	Next i
	
	*result\l = result

Но мне она не нравится т.к. завязана на конкретный способ хранения числа в памяти.

Отредактировано SadStar (18.07.2016 06:28:10)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Подскажите алгоритм декодирования