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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2012, 10:02   #1
arxlex
Пользователь
 
Регистрация: 18.01.2012
Сообщений: 23
По умолчанию Перевод с QT5 в Delphi

Преобразование байтов в числа:
Рабочий исходный код (QT5):
Код:
unsigned int bytes_to_int(QByteArray data, int start)
{
    unsigned int result=0;
    unsigned char temp;

    temp = data[start + 3];
    result = result | temp;
    result = result << 8;

    temp = data[start + 2];
    result = result | temp;
    result = result << 8;

    temp = data[start + 1];
    result = result | temp;
    result = result << 8;

    temp = data[start];
    result = result | temp;

    return result;
}
Моя версия перевода(не работает=():
Код:
function ByteToInt(const s: string; base: integer): integer;
var
  i: integer;
  c: Char;
begin
  i := 0;
  c := s[base + 3];
  i := i + ord(c);
  i := i shl 8;
  c := s[base + 2];
  i := i + ord(c);
  i := i shl 8;
  c := s[base + 1];
  i := i + ord(c);
  i := i shl 8;
  c := s[base];
  i := i + ord(c);
  Result := i;
end;
К сожелению мой перевод не работает, показывает не корректные значения. Кто подскажет в чем может быть ошибка? Спасибо!
Mess With the Best, Die Like the Rest

Последний раз редактировалось arxlex; 29.03.2012 в 10:05.
arxlex вне форума Ответить с цитированием
Старый 29.03.2012, 10:22   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Компилятор делает то, что написано в коде. Что вы хотите получить из такой строки
"1234"?
Ответы:
1)875770417
2)52515049
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 29.03.2012, 10:31   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Байт в число? Ну как-то так...
Код:
function ByteToInt(const aValue:Byte):Integer;
var
 aHEX:String;
 aInt:Integer;
begin
 Result:=-1;
 aInt:=-1;
aHex:=''; 
aHex:=SysUtils.IntToHex(aValue,2*SizeOf(aValue));
 if (aHex <> EmptyStr) then
 begin
   If TryHexToInt(aHex,aInt) then
   begin
   if aInt <> -1 then
   Result:=aInt;
   end;
 end;
end;
Человек_Борща вне форума Ответить с цитированием
Старый 30.03.2012, 08:38   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Есть мнение, что в QByteArray нумерация начинается с нуля, а не с единицы, как в строках в Delphi.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 30.03.2012, 08:47   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)GunSmoker прав.
2)а почему строка выбрана аналогией массива байт?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.03.2012, 10:11   #6
arxlex
Пользователь
 
Регистрация: 18.01.2012
Сообщений: 23
По умолчанию

Вот данные которые надо прочитать:
Код:
data(TStringList):
#1#0#0#0' '#0#0#0#0'$'#$1F#0#$1C#2#0#0'@'#3#0#0#0#0#0#0#8#0#0#0#$10#0#0#0#8#0#0#0#8#0#0#0#8#0#0#0#$18#0#0#0#8#0#0#0
В data-е храняться данные полученные с телефона на базе андроид. Точнее данные скриншота экрана, высота, ширина, глубина экрана в пикселях, оффсет красного, размер красного и .т.п.

с помощи функции int bytes_to_int(QByteArray data, int start) данные преобразуются в числах. Например высота - 320, ширина - 240, глубина цвета - 4 и .т.п.

Код:
                        bytesPerPixel = bytes_to_int(data, 4)/8;
                        width = bytes_to_int(data, 12);
                        height = bytes_to_int(data, 16);
                        redOffset = bytes_to_int(data, 20);
                        redSize = bytes_to_int(data, 24);
                        blueOffset = bytes_to_int(data, 28);
                        blueSize = bytes_to_int(data, 32);
                        greenOffset = bytes_to_int(data, 36);
                        greenSize = bytes_to_int(data, 40);
                        alfaOffset = bytes_to_int(data, 44);
                        alfaSize = bytes_to_int(data, 48);
Mess With the Best, Die Like the Rest
arxlex вне форума Ответить с цитированием
Старый 30.03.2012, 12:46   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

перечитать мой пункт 2, у вас не строка в функции то.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.03.2012, 13:01   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Если исходные данные в Delphi вы помещаете в строку, то я бы написал bytes_to_int так:

Код:
function data_to_int(const AData: AnsiString; const AOffset: Integer): Cardinal;
begin
  Result := PCardinal(@AData[AOffset + 1])^;
end;

...

var
  Data: AnsiString;
begin
  ...
  bytesPerPixel := data_to_int(data, 4) div 8;
  width := data_to_int(data, 12);
  height := data_to_int(data, 16);
  redOffset := data_to_int(data, 20);
  ...
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 30.03.2012, 16:08   #9
arxlex
Пользователь
 
Регистрация: 18.01.2012
Сообщений: 23
По умолчанию

Спасибо, GunSmoker-у! Тема закрыта
Mess With the Best, Die Like the Rest
arxlex вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод C# в Delphi. sxcine Фриланс 2 08.06.2011 15:03
Перевод из С++ в Delphi fredwriter Помощь студентам 3 08.10.2010 14:58
Перевод из Delphi в C++ SunShine Помощь студентам 0 15.12.2009 20:40
Перевод Delphi на C++ Игорь777 Помощь студентам 2 01.05.2009 16:28
Перевод из C в Delphi Пaвeл Общие вопросы C/C++ 2 30.04.2009 22:43