|
|
|
| Подскажите, пожалуйста, как в Си++ будет выглядеть это:
for ($i = 0; $i < $sl; $i++)
$str[$i] = chr(ord($str[$i]) + ord($key[$i])); |
З.Ы. sl - длина строки str, key такой же/длиннее | |
|
|
|
|
|
|
|
для: ~AquaZ~
(11.01.2010 в 02:15)
| | chr() , ord() не нужны
, символы строки можно просто складывать
, только непонятно что будет если например кодировка однобайтная и в cp866 символ 'я' это 0хFF
, при сложении 'я' + 'я' получится 0xFF0 , а это уже не один байт
(upd// здесь загнул :) получится что-то вроде 0x1FE)
Или строка в которую это всё складывается типа WCHAR[] ? | |
|
|
|
|
|
|
|
для: exp
(11.01.2010 в 22:22)
| | Строка типа String (в Builder String это класс). Мне самому не нравится идея складывать эквиваленты. Но в PHP работает, и процесс обратимый. Правда строка получается вдвое длиннее...
Как сделать, чтобы эквиваленты складывались и создавались 2 символа, т.е. ¶ (0xB6) + ¿ (0xBF) = ☺u (0x0175) | , но при этом как-нибудь правильно обработать" (0x22) + f (0x42) = [ТАКОВА_СИМВАЛА_НЕТ]d (0x0064) | ? | |
|
|
|
|
|
|
|
для: ~AquaZ~
(12.01.2010 в 17:02)
| | чего-то наваял :)
попробовал просто лишний байт 0x01 так и записывать 0x01
#include <windows.h>
char* ishs = "строка не закодирована";
char* key = "ключ строка";
char res[sizeof(&ishs)*2];
void x_encode(void ) {
char* cTmp = ishs;
char* cKey = key;
char* cRes = (char*) res;
for( ; *cTmp != '\0'; cTmp++, cKey++, cRes++) {
if (*cKey == '\0') cKey = key;
if ((*cTmp + *cKey) & 0x100) *cRes++ = 0x01 ;
*cRes = (*cTmp + *cKey) ;
}
*cRes++ = '\0';
}
void x_decode(void ){
char* cRes = res;
char* cTmp = res;
char* cKey = key;
short w;
for( ; *cTmp != '\0'; cKey++, *cTmp++, *cRes++){
if (*cKey == 0) cKey = key;
if (*cTmp == 0x01) { // при складывании двух ненулей столько не бывает
w = 0x100;
cTmp++;
w |= *cTmp;
} else w = *cTmp;
*cRes = (w - *cKey) ;
}
*cRes++ = '\0';
}
int main(void){
x_encode( );
MessageBox(0, res, "x_encode",0);
x_decode( );
MessageBox(0, res, "x_decode",0);
return 0;
} | здесь как-бы всё просится в одну функцию , обычно так навтыкаю, потом оптимизирую
, и делал в MSVC 6 , если делаю в остальных MSVC , там приходится убирать _UNICODE которое они инхерят по умолчанию. А классы я как-то не очень пробовал всякие | |
|
|
|
|
|
|
|
для: exp
(12.01.2010 в 22:19)
| | Я тут нихрена не понял =(
У меня в C++ Builder строка - это класс, а не typedef.
[upd] Всё, я 00 буду заменять на \0.
[upd] У \0 ASCII - 00! | |
|
|
|
|
|
|
|
для: ~AquaZ~
(12.01.2010 в 22:32)
| | Как и я нихрена не понимаю всякие String() :)
Тут всё просто,
а '\0' , я там даже в одном месте и написал как 0, просто так понятнее что сравнивается с символом. , так-же как вместо 0x01 мог делать 1или 01 (так вроде восьмиричная, если не путаю)
,я же говорю что сразу-же как понапечатал, поправил пару ошибок чтобы скомпилировалось и выложил, Всёроавно У Вас Буилдер ,) ошибки показали-бы , чего там он не переваривает.
Я на Си стараюсь кодить , без плюсплюсов
, делаю свою функцию вместо main, и получаю файл килобайта на 3-4 , который поизучая в дизассемблере можно понять чего компилятор сам оптимизирует , и чего можно ещё поизменить.
, строго 32x битные пока программы мучаю :) они понятнее | |
|
|
|
|
|
|
|
для: exp
(13.01.2010 в 00:41)
| | Спасибо. Тему можно закрыть.
А этот код я и скомпилировать не пытался, извините, диБилдыр консоль не жуёт. | |
|
|
|
|
|
|
|
для: ~AquaZ~
(13.01.2010 в 00:46)
| | Да на здоровье :)
а в консоль там я ничего не выводил,
конечно мог всё это дело дооптимизировать, до вставок __asm{} правда редко доходит, но лениво | |
|
|
|