Функция memcpy

neket89

Новичок
Функция memcpy

Здравствуйте. В Си есть функция memcpy(), копирующая содержимое одной области памяти в другую. Не знает ли кто аналогичную функцию в php?
Если точнее меня интересует как будет выглядеть в php строка на Си:
PHP:
memcpy(salt+3, inn+l-8, 8);
Заранее благодарен.
 

neket89

Новичок
Вопрос в том, что мне нужно переписать код Си на php
вот сам код:
PHP:
static void clientgenAnswer (const char * const inn, const char * const reg_key, char * const answer) {
	char salt[]="$1$........";
	size_t l=strlen(inn);
	memcpy(salt+3, inn+l-8, 8);
	char *tmp=crypt(reg_key, salt);
	memcpy(answer, tmp+12, strlen(tmp)-12);
}
И как быть с функцией memcpy я не знаю:confused:
 

Духовность™

Продвинутый новичок
Что значит переписать код Си на PHP? С - один язык, PHP - другой. Они по разному работают, по разному устроены, предназначены для разных задач.

Для чего тебе нужна функция clientgenAnswer? Что она должна делать - ты можешь это словами описать?
 

neket89

Новичок
Ок, сейчас всё расскажу. У меня есть генератор ключей, написанный на Си. Мне нужно, чтобы этим генератором люди могли пользоваться через свой браузер. Для этого и надо мне его переписать на php. вот полный код
PHP:
#include <assert.h>
#include <crypt.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

					       
static int clientCheckINN (const char *inn, const char *hwserial) {
	static const char *salt="$1$SBALIBAL";
	char *tmp=crypt(inn, salt);
	unsigned char result[23];
	assert(strlen(tmp)-12==sizeof(result)-1);
	memcpy(result, tmp+12, strlen(tmp)-12);
	result[22]='\0';
	return strcmp(result, hwserial);
}


static void clientgenAnswer (const char * const inn, const char * const reg_key, char * const answer) {
	char salt[]="$1$........";
	size_t l=strlen(inn);
	memcpy(salt+3, inn+l-8, 8);
	char *tmp=crypt(reg_key, salt);
	memcpy(answer, tmp+12, strlen(tmp)-12);
}


__attribute ((noreturn))
static void bailout (void) {
	fprintf(stderr, "usage: p2kg INN HWSERIAL\n");
	exit(1);
}


int main (const int argc, const char **argv) {
	if (argc!=3) bailout();
	const char *inn=argv[1];
	if (strlen(inn)!=23) {
		fprintf(stderr, "INN length wrong\n");
		bailout();
	}
	const char *hwserial=argv[2];
	if (strlen(hwserial)!=22) {
		fprintf(stderr, "HD serial length wrong\n");
		bailout();
	}
	if (clientCheckINN(inn, hwserial)) {
		fprintf(stderr, "INN invalid\n");
		bailout();
	}
	char answer[23];
	clientgenAnswer(inn, hwserial, answer);
	printf("%s\n", answer);
	return 0;
}
-~{}~ 22.08.09 16:32:

Небольшие пояснения к коду. inn и hwserial вводит пользователь. В ответ в переменной answer получает код. Изначально я написал только функцию clientgenAnswer, которая отвечает за генерацию кода. Все остальные проверки я и так могу написать на php
 

Alexandre

PHPПенсионер
oid *memcpy(void *dst, const void *src, size_t n);

где:

* dst — адрес буфера назначения
* srс — адрес источника
* n — количество байт для копирования

Функция копирует n байт из области памяти, на которую указывает src, в область памяти, на которую указывает dst. Функция возвращает адрес назначения dst.
далее смотрим по алгоритму и проверяем.

кусок кода:
PHP:
 char salt[]="$1$........";
    size_t l=strlen(inn);
    memcpy(salt+3, inn+l-8, 8);
    char *tmp=crypt(reg_key, salt);
    memcpy(answer, tmp+12, strlen(tmp)-12);
копирует последние 8 байт из переменной inn в третий байт salt, и их соединяет
в РНР это может быть всего лишь: '$1$'.substring( $inn,8);

далее идет шифрование и перепись данных в выходной буфер последних 12 байт,правда не знаю зачем такая странная логика, наверно чтоб уменьшить длинну ключа :).

в РНР это substring( $tmp,12);
гарантировать что функции crypt в РНР и Си будут работать одинаково я не могу. Этого добиться можно ценой проб и ошибок. По этому, лично я бы вызывал эту, уже надежную функцию через system и не парился бы с переводом на РНР:

$res = exec ( "superctypt $inn $code" , $key);
 

neket89

Новичок
Спасибо огромное!! А не подскажите, как вывести эту функцию через system?

-~{}~ 22.08.09 17:25:

То есть, как я понимаю, в переменную $inn заносится значение, в переменную $code заносится код на Си и на выходе получается ключ $key ?
 

Adelf

Administrator
Команда форума
Нет. можно сделать программу, скомпилировав твой с++-код. и вызывать ее из php с помощью system.
 

neket89

Новичок
Спасибо, попробую скопилировать и проверить.
А фукнцию clientgenAnswer я переписал, вроде бы работает)) Вот она:
PHP:
<?php
    $salt = "$1$........";
    $inn = '7583904938471263857648';
	$l=strlen($inn)-8;
    $salt = str_replace(substr($salt, 2, 1), substr($inn,$l), $salt);
    print $salt;
	$tmp=crypt($reg_key, $salt);
	$l=strlen($tmp)-12;
	$key=substr($tmp,$l);
	echo "<br>";
	echo $key;
?>
-~{}~ 22.08.09 18:48:

Осталось проверить соответствуют ли друг другу функции crypt

-~{}~ 22.08.09 19:53:

Ещё один вопрос) Отсчёт байтов начинается с нуля или единицы?
 
Сверху