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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2014, 21:56   #1
Pavel_Filatov
 
Аватар для Pavel_Filatov
 
Регистрация: 19.07.2014
Сообщений: 4
По умолчанию Трансляция куска кода с си на делфи

Приветствую уважаемое сообщество делфи программистов!
Собственно изучаю способы представления информации, в частности сейчас интересует энтропия. Есть пример некоторого кода на C, хотелось бы перевести его на делфи для лучшего понимания и экспереметнов, т.к. с си не очень я, всвязи с чем прошу помощи у сообщества.

В комментах моё представление данного си кода на делфи, я знаю что много ошибок, прошу профи помочь поправить.

Код:
        char *pBuffer1; // pBuffer1 : pchar;
	char *pBuffer2; // pBuffer2 : pchar;
	DWORD file_size1; // file_size1 : DWORD;
	DWORD file_size2; // file_size2 : DWORD;
	DWORD num_bytes = 0; // num_bytes : DWORD; 
	DWORD mod = 0; // v_mod : DWORD;
	unsigned int i =0; // i, j, ii, cnt : integer;
	int j = 0;
	char new_byte = 0; // new_byte : DWORD;
	int cnt = 0; 
	
	//т.к. mod в паскале зарезервированное слово, объвим его как v_mod
	
	mod = file_size1 % 3;	// v_mod := file_size1 mod 3;
	file_size2 = file_size1 + (file_size1 / 3) + (mod != 0); // file_size2 := file_size1 + (file_size1 div 3) + (v_mod <> 0); << тут не ясно
	pBuffer2 = (char*)malloc(sizeof(char) * file_size2 + 1); // pBuffer2 := SetLength(sizeof(char) * (file_size + 1)); ???

	for(i = 0, j = 0; i < file_size1; i++, j++) // тут получается нужно делать два цикла первый для i второй внутри для j ?
	{
		pBuffer2[j] = pBuffer1[i];	// pBuffer2[j] := pBuffer1[i];
		pBuffer2[j] ^= 0x5F;	    // pBuffer2[j] := pBuffer1[j] xor $5F;
		new_byte = (new_byte | (((pBuffer2[j] & 0xC0) >> 6) << (cnt * 2)));	// new_byte := (new_byte or (((pBuffer2[j] and $C0) shr 6) shl (cnt * 2)));
		//отрезаем старшие 2 бита 1-ого байта (из очередных 3-х байт) и сохраняем их в первые 2 младшие бита (позиция 0-1) нового байта;
		//отрезаем старшие 2 бита 2-ого байта и сохраняем их в следующие 2 младших бита (2-3) нового байта; 
		//отрезаем старшие 2 бита 3-его байта и сохраняем их в следющие 2 младших бита (4-5) нового байта; 
		++cnt;	//inc(cnt);
		pBuffer2[j] = pBuffer2[j] & 0x3F;	// pBuffer2[j] := pBuffer2[j] and $3F;

		if((cnt == 3) || (((i + 1) == file_size1) && mod))	// if ((cnt = 3 ) or (((i + 1) = file_size1) and v_mod));
		{
			++j;											// j := j + 1;  
			pBuffer2[j] = new_byte; 						// pBuffer2[j] := new_byte;
			new_byte = 0;
			cnt = 0;
		}
	}

	num_bytes = 0;

Последний раз редактировалось Pavel_Filatov; 19.07.2014 в 22:07.
Pavel_Filatov вне форума Ответить с цитированием
Старый 19.07.2014, 22:51   #2
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

к сожалению в этом отрывке кода энтропии нет
s.Creator вне форума Ответить с цитированием
Старый 20.07.2014, 00:00   #3
Pavel_Filatov
 
Аватар для Pavel_Filatov
 
Регистрация: 19.07.2014
Сообщений: 4
По умолчанию

Цитата:
Сообщение от s.Creator Посмотреть сообщение
к сожалению в этом отрывке кода энтропии нет
Оно и правильно, т.к. данный пример сам служит инструментом для нормализации энтропии нужного массива данных, и следовательно сей пример призван пролить свет на логику этого процесса, в связи с чем и прошу помочь разобрать ошибки при трансляции.
Pavel_Filatov вне форума Ответить с цитированием
Старый 20.07.2014, 14:43   #4
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Код:
var
	// pBuffer1 : array of AnsiChar;  по логике кода должна передаваться параметром в функцию
	pBuffer2 : array of AnsiChar;
	// file_size1 : DWORD; по логике кода должна передаваться параметром в функцию
	file_size2 : DWORD;
	num_bytes : DWORD; 
	v_mod : DWORD;
	i : Cardinal;// unsigned int i =0;
	j, ii, cnt : integer; 
	new_byte : AnsiChar; // char new_byte = 0;
begin
	new_byte := #0;
	int cnt = 0; 
	num_bytes := 0;
	v_mod := 0; 
	 i := 0;
	 j := 0;
	//т.к. mod в паскале зарезервированное слово, объвим его как v_mod
	
	v_mod := file_size1 mod 3;
	file_size2 := file_size1 + (file_size1 div 3)
	if (v_mod <> 0)then Inc(file_size2);
	pBuffer2 := SetLength(pBuffer2, (file_size + 1)); 
	j := -1;
	for i := 0 to file_size1 - 1 do // тут получается нужно делать 1 цикл первый для i и j 
	begin
		Inc(j);
		pBuffer2[j] := pBuffer1[i];
		pBuffer2[j] := pBuffer1[j] xor $5F;
		new_byte := (new_byte or (((pBuffer2[j] and $C0) shr 6) shl (cnt * 2)));
		//отрезаем старшие 2 бита 1-ого байта (из очередных 3-х байт) и сохраняем их в первые 2 младшие бита (позиция 0-1) нового байта;
		//отрезаем старшие 2 бита 2-ого байта и сохраняем их в следующие 2 младших бита (2-3) нового байта; 
		//отрезаем старшие 2 бита 3-его байта и сохраняем их в следющие 2 младших бита (4-5) нового байта; 
		Inc(cnt);
		pBuffer2[j] := pBuffer2[j] and $3F;

		if ((cnt = 3 ) or (((i + 1) = file_size1) and v_mod)) then
		begin
			Inc(j);		 
			pBuffer2[j] := new_byte;
			new_byte := #0;
			cnt := 0;
		end;
	end;

	num_bytes := 0;
s.Creator вне форума Ответить с цитированием
Старый 20.07.2014, 21:50   #5
Pavel_Filatov
 
Аватар для Pavel_Filatov
 
Регистрация: 19.07.2014
Сообщений: 4
По умолчанию

s.Creator спасибо вам за помощь!

вот с этой строкой что-то не получается разобраться..

Код:
new_byte := (new_byte or ((( chr(ord(pBuffer2[j]) and $C0) shr 6) shl (cnt * 2))));
Pavel_Filatov вне форума Ответить с цитированием
Старый 22.07.2014, 20:05   #6
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

на всякий случай
Код:
begin
	new_byte := #0;
	cnt := 0;
	num_bytes := 0;
	v_mod := 0;
	 i := 0;
	 j := 0;
	//т.к. mod в паскале зарезервированное слово, объвим его как v_mod

	v_mod := file_size1 mod 3;
	file_size2 := file_size1 + (file_size1 div 3);
	if (v_mod <> 0)then Inc(file_size2);
	SetLength(pBuffer2, (file_size + 1));
	j := -1;
	for i := 0 to file_size1 - 1 do // тут получается нужно делать 1 цикл первый для i и j
	begin
		Inc(j);
		pBuffer2[j] := pBuffer1[i];
		pBuffer2[j] := AnsiChar(Ord(pBuffer1[j]) xor $5F);
		new_byte := AnsiChar((Ord(new_byte) or (((Ord(pBuffer2[j]) and $C0) shr 6) shl (cnt * 2))));
		//отрезаем старшие 2 бита 1-ого байта (из очередных 3-х байт) и сохраняем их в первые 2 младшие бита (позиция 0-1) нового байта;
		//отрезаем старшие 2 бита 2-ого байта и сохраняем их в следующие 2 младших бита (2-3) нового байта;
		//отрезаем старшие 2 бита 3-его байта и сохраняем их в следющие 2 младших бита (4-5) нового байта;
		Inc(cnt);
		pBuffer2[j] := AnsiChar(Ord(pBuffer2[j]) and $3F);

		if (cnt = 3 ) or (((i + 1) = file_size1) and (v_mod <> 0)) then
		begin
			Inc(j);
			pBuffer2[j] := new_byte;
			new_byte := #0;
			cnt := 0;
		end;
	end;

	num_bytes := 0;end;
or и and для битовых работают с числами поэтому надо силволы переводить с цифры а после операций обратно в C++ символы и байты одинаковы
s.Creator вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
шифрование отдельного куска кода beegl Общие вопросы Delphi 27 14.03.2014 15:54
[Delphi] Сшить 3 куска кода (WinApi) SartAlfard Помощь студентам 0 17.10.2011 19:11
Шифрование куска кода программы Crystallon Общие вопросы Delphi 6 06.05.2011 11:29
Шифрование куска кода программы Crystallon Фриланс 0 05.05.2011 15:55
Разбор куска кода. Alexcomeback Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 05.04.2011 18:14