eXeL@B —› Программирование —› Вопрос знатокам С++ |
Посл.ответ | Сообщение |
|
Создано: 12 марта 2012 00:25 · Поправил: depler · Личное сообщение · #1 есть функция на С++, начинается так: Code:
Задача - переписать на delphi, застопорился на месте unsigned int* ldata = (unsigned int*) data; и соответсвенно заполнении его. Насколько я понимаю С++ ldata - это указатель на массив data, но не пойму тогда, почему к нему обращаются как к обычному массиву, и заполняет он data както странно. Вот например data[16] какому элементу data соответствует? ----- Лень - это подсознательная мудрость |
|
Создано: 12 марта 2012 00:43 · Личное сообщение · #2 |
|
Создано: 12 марта 2012 00:44 · Поправил: HandMill · Личное сообщение · #3 depler пишет: Вот например data[16] какому элементу data соответствует? попытаюсь исправить для начала вопрос: Вот например ldata[16] какому элементу data соответствует? ответ: соответствует 16 * sizeof(int) элементу массива data (умножаем на sizeof(int) ибо приведение типов). При переводе с си на делфи, стоит напомнить что в си нумерация элементов массивов в отличае от делфи начинается с 0. При объявлении массива: char data[1024]; помните что data является указателем на массив. И так будет в любом языке программирования. Выражение (unsigned int*) data; ничто иное как банальное приведение типов. ----- все багрепорты - в личные сообщения |
|
Создано: 12 марта 2012 01:02 · Поправил: depler · Личное сообщение · #4 r_e, HandMill в теории оно конечно так, но вот наваял на делфи: Code:
В приниципе должно работать, но delphi заполняет "строго по математике" 64, 68, 72... С++ начинает почему то с 66, затем 70, откуда то 72, и т.д. Выкладываю полный исходник этой штуки. Гляньте, то ли я дурак, то ли лыжи не едут. )) Если можно упростите функцию, чтобы без указателей была. ----- Лень - это подсознательная мудрость |
|
Создано: 12 марта 2012 01:09 · Личное сообщение · #5 |
|
Создано: 12 марта 2012 03:12 · Личное сообщение · #6 1) при типе data: array of DWORD; ====> C memcpy(data, input, length); не идентично ====> Delphi for i := 1 to length(password) do data[i-1]:=ord(password[i]); в первом случае (при рассмотрении побайтно 'p', 'a', 's', 's' .... во втором 'p',0,0,0,'a',0,0,0,'s',0,0,0,'s',0,0,0 .... 2) ldata не используется 3) при типе data: array of DWORD; ИМХО вместо data[(i + 16)*sizeof(DWORD)] достаточно data[i+16], как дальше по выражению. ----- 127.0.0.1, sweet 127.0.0.1 |
|
Создано: 12 марта 2012 11:06 · Поправил: VodoleY · Личное сообщение · #7 depler а не рассматривали ли вы библиотечку для делфи dcpcrypt2-laz-2.0.3-2, там много крипто и хешей под делфю портированно, я ей частенько пользуюсь и sha там есть... Code:
вот кусок из модуля.. как по мне весьма похоже ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... | Сообщение посчитали полезным: sendersu, DimitarSerg |
|
Создано: 12 марта 2012 16:45 · Личное сообщение · #8 иногда проще выучить с++ ----- Реверсивная инженерия - написание кода идентичного натуральному | Сообщение посчитали полезным: BoRoV |
|
Создано: 12 марта 2012 17:48 · Личное сообщение · #9 |
|
Создано: 12 марта 2012 18:04 · Личное сообщение · #10 |
|
Создано: 12 марта 2012 18:07 · Личное сообщение · #11 |
|
Создано: 13 марта 2012 02:43 · Личное сообщение · #12 Таки накодил я эту хрень, туды ее в качель )) Если кому интересно: Code:
----- Лень - это подсознательная мудрость | Сообщение посчитали полезным: Dart Sergius, igorca |
|
Создано: 09 мая 2012 01:16 · Личное сообщение · #13 Вообще то это не С++, а код школьника. Признаки: 1) Судя по коду глобальная область видимости функции - то есть по простому: функционал по каким то причинам вынесен за пределы класса. Скорее всего изначально на этапе проектирования допущена ошибка, либо вообще не проектировали и об UML ничего не знали, сразу код писали. Либо это метод класса и код приведён не полностью. 2) Magic Value разбросаны по коду, как мусор по хате: char data[1024]; memset(data, 0, 1024); for (i = 0; i < 64; i++); ldata[i + 16]; и т.д. Так не пишут. 3) unsigned int* ldata = (unsigned int*) data; Грубая ошибка: Запрещённое приведение в стиле Си, когда должно выполняться приведение в стиле С++, для этого у языка имеются соответствующие операторы. 4) unsigned int a, b, c, d, e, g; Бестолковые имена переменных. |
|
Создано: 09 мая 2012 01:26 · Личное сообщение · #14 Мистер мега кодер. Вы дату постов смотрели? Да и решен уже вопрос топика. Первое предупреждение. | Сообщение посчитали полезным: plutos |
eXeL@B —› Программирование —› Вопрос знатокам С++ |
Эта тема закрыта. Ответы больше не принимаются. |