Вот, написал конвертер строк в ASCII и НЕX вид. Может быть полезен при проведении sql-инъекций, когда в запросы надо вставить данные в виде char(104,101,108,108,111) или в hex - 0x68656c6c6f. Создан с целью экономии времени. (Что он успешно делает) Пользоваться так: Code: [B]haos@localhost(23:49:49)~ $[/B] sql-conv Usage: sql-conv 'String for converting' [B]haos@localhost(23:49:58)~ $[/B] sql-conv 'Hello, World!' Source string ==> Hello, World! ASCII string ===> char(72,101,108,108,111,44,32,87,111,114,108,100,33) HEX string =====> 0x48656c6c6f2c20576f726c6421 [B]haos@localhost(23:50:11)~ $[/B] Исходники лежат тут: http://lanham.nm.ru/sources/ Upd(10 Nov 2007): P.S. писал для себя, тут выложил только потому , что это может кому-либо пригодиться. Code: /* sql-conv.c Author: L0rd_Ha0S (forum.antichat.ru) Description: Converting strings to ASCII and HEX codes. For SQL-Inj. Date: 7 Nov, 2007 21:00 Charset for comments: UTF-8 Version: 0.2 Compiling: gcc -o sql-conv sql-conv.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> //#include <malloc.h> // Needed by Windows. Uncomment this if you use Windows. void usage(const char *ProgramName); void word2hex(const char *SourceString, char *ResultBuffer, int string_length); void word2ascii(const char *SourceString, char *ResultBuffer, int string_length); int main(int argc, char *argv[]) { if (argc < 2) // Проверка параметров usage(argv[0]); const char *SqlString = argv[1]; // сохраняем исходную строку в SqlString const int SqlStringLength = strlen(SqlString); // вычисляем длину переданной строки char *buffer; // будет хранить указатель на нашу память if (SqlStringLength == 0){ printf(" Source string is empty!\n"); exit (1); } else printf("\n Source string ==> %s\n", SqlString); // выводим исходную строку /* Выделяем область памяти, в которой будет храниться результирующая строка. Размер выделяемой памяти равен выражению SqlStringLength*4, т.к. ascii-вид строки(в текстовом виде) будет занимать размер исходя из => 1 символ = 3 символа(max) + 1 символ запятой + символ \0. Но т.к. последний символ печатается без запятой, то место запятой займет символ \0. Для хранения hex-вида(в текстовом представлении) нужно ещё меньше памяти. Поэтому будем выделять память по-максимуму, т.е. по ascii-виду - SqlStringLength*4 */ if ((buffer = (char *) malloc(SqlStringLength*4)) == 0 ){ printf(" malloc() is failed!\n"); exit (1); } memset(buffer, 0, SqlStringLength*4); // заполняем нашу память нулями word2ascii(SqlString, buffer, SqlStringLength); printf("\n ASCII string ===> char(%s)\n", buffer); memset(buffer, 0, SqlStringLength*4); // очищаем буфер для вызова word2hex() word2hex(SqlString, buffer, SqlStringLength); printf("\n HEX string =====> %s\n\n", buffer); free(buffer); // Освобождаем память, которую мы использовали для хранения результата exit (0); } /* usage() */ void usage(const char *ProgramName) { printf(" Usage: %s \'String for converting\'\n", ProgramName); exit (0); } /* Функция word2hex() конвертирует переданную ей строку в hex вид, результат сохраняется в выделенной для этого области памяти. Принимает 3 параметра: 1й - указатель на строку, которую нужно отконвертировать, 2й - указатель на область памяти, где будет храниться результат выполнения, 3й - длина исходной строки в символах (strlen()) */ void word2hex(const char *SourceString, char *ResultBuffer, int string_length) { int i; // счётчик символов char buf_tmp[3]; // буфер, хранящий текстовое значение hex-кода символа. for (memcpy(ResultBuffer, "0x", sizeof("0x")) && (i = 0); i < string_length; i++){ snprintf(buf_tmp, sizeof("%x"), "%x", SourceString[i]); strcat(ResultBuffer, buf_tmp); } } /* Функция word2ascii() конвертирует переданную ей строку в ascii вид, результат сохраняется в выделенной для этого области памяти. Принимает 3 параметра: 1й - указатель на строку, которую нужно отконвертировать, 2й - указатель на область памяти, где будет храниться результат выполнения, 3й - длина исходной строки в символах (strlen()) */ void word2ascii(const char *SourceString, char *ResultBuffer, int string_length) { int i; // счётчик символов char buf_tmp[5]; // буфер, хранящий текстовое значение hex-кода символа. for (i = 0; i < string_length; i++){ if (i != (string_length - 1)){ if (SourceString[i] < 100){ snprintf(buf_tmp, sizeof("%2d,"), "%2d,", SourceString[i]); strcat(ResultBuffer, buf_tmp); } else{ snprintf(buf_tmp, sizeof("%3d,"), "%3d,", SourceString[i]); strcat(ResultBuffer, buf_tmp); } } else{ if (SourceString[i] < 100){ snprintf(buf_tmp, sizeof("%2d"), "%2d", SourceString[i]); strcat(ResultBuffer, buf_tmp); } else{ snprintf(buf_tmp, sizeof("%3d"), "%3d", SourceString[i]); strcat(ResultBuffer, buf_tmp); } } } }
To [x26]VOLAND: Честно говоря, не думаю что ради вывода из трёх строчек стоит писать GUI, к тому же программа потеряет свою переносимость, и будет заточена именно под конкретную ОС. Этот исходник будет работать и на *nix, и на винде. Это не релиз наикрутейшей проги, которой не хватает только gui. Я её писал в первую очередь для себя, чтобы избавить себя от гемора, а так как я пользуюсь только Линуксом, то мне было удобней сделать её именно в консольном варианте, ибо консоль у меня запущена всегда. Если у меня будет время, я подумаю над тем, как примотать к нему GUI, а пока я могу предложить сделать это тебе.
SQL-Conv v0.2 Написал новую версию. Все переписано по-новому. Теперь функции сохраняют результат в памяти, а не выводят его на stdout, так что при желании гуи прикрутить не составит большого труда (кому надо). В первом посте обновил исходник на вторую версию. При компиляции под виндой, не забудьте раскомментировать строку Code: #include <malloc.h> Работоспособность проверена на Linux, FreeBSD(tnx Alexsize), Windows(Vista, на остальных значит тоже будет работать) P.S. Просьба к людям более опытным чем я - посмотрите исходник (вторую версию), мож найдете какие ошибки, может что-то можно сделать проще чем у меня. Всё-таки опыта у меня пока не так много, так что буду благодарен за любые замечания. Обе версии лежат здесь: http://lanham.nm.ru/sources/
тоже самое только чутка покороче) Code: #include <stdio.h> int main(int argc,char**argv) { if (argc != 2){printf("%s <string>\n",argv[0]);return(1);} for(printf("Source -> %s\n",argv[1]),printf("Hex -> 0x"),argv[0]=argv[1];*argv[1];*argv[1]++) printf("%x",*argv[1]); for(printf("\nAsci -> Char(%d",*argv[0]),*argv[0]++;*argv[0];*argv[0]++) printf(",%d",*argv[0]); return(printf(");\n")); }
эх и я тада влеплю свои 5 коп на асп дот нет в TextBox3 - вписываем строку в TextBox4 - выводица код типа char(116,101,115,116) сорц обработки бутона TextBox4.Text = ""; string sin2 = TextBox3.Text; string temp = ""; for (int i = 0; i < sin2.Length; i++) temp += String.Format("{0:d},", (int)sin2); if (temp == "") return; temp = temp.Remove(temp.Length - 1); TextBox4.Text = "char(" + temp + ")"; всё это щастье вист тута http://shred-11.iis7.parking.ru
Чел? А ты в курсе, что sizeof(char*) == 4. или 8 на 64-битных пл-х. но никак не количеству байт, которые ты передавал malloc'у. Я просто не понимаю, если ты основ С не знаешь, то почему бы не писать на делфи?
Code: if (argc < 2) // Проверка параметров usage(argv[0]); const char *SqlString = argv[1]; // сохраняем исходную строку в SqlString const int SqlStringLength = strlen(SqlString); // вычисляем длину переданной строки char *buffer; // будет хранить указатель на нашу память в Си объявление переменных должно находиться до любого выполняемого кода.
__mad А ты типа не знаешь? В зависимости от компилятора. VS2005 гневно ругается, например, и отказывается компилировать.
Чего ты не замечал? Он про C говорит, а не про С++. Ни один C-компилятор не допускает обьявлений после кода.
ну так и я про C, а не про С++ в gcc без проблем компилится : D даж предупреждений нету... зы gcc расшифровывается не C++ : D а GNU project C and C++ compiler
GCC значит это позволяет. Но по стандарту C все обьявления должны быть сделаны ДО первого оператора. Боюсь сейчас сильно напиздить. Во всяком случае, для C это стандарт _оформления_. Как найду ISO стандарты - отпишу. Меня шокировало если честно, что gcc это допускает.
КЕЗ, честно говоря я тоже всегда так думал (про стандарт). Но на форуме (по-моему васм.ру) недавно прочитал про то, что есть какие-то поправки, и, согласно новому стандарту, переменные можно объявлять в теле функции.
Думал сюда никто не заходит, а тут вон сколько понаписали.... только что - покороче Да, как-то не задумывался над этим, спасибо. Поправлю сейчас. Я ведь написал, что опыта у меня МАЛО! Основы в голову сразу не ложатся, понимание приходит со временем. Не будь таким критичным, на ошибках учатся. Теперь я буду делать одной ошибкой меньше. А на счёт делфи... Делфи под Линуксом... Как-то нет желания. Это правило хорошего тона - объявлять все переменные вначале программы. Переменная может быть объявлена в любом месте программы до её непосредственного использования. У меня все переменные объявлены ДО их непосредственного использования. Я намерено их объявил после проверки параметров. Зачем мне их объявлять перед функцией usage()? Ни одна из этих переменных ей не используется. usage() завершит выполнение программы если нет параметров, если же они есть, выполнение продолжится. Только в случае, если параметры заданы имеет смысл объявлять эти переменные. Кстати, gcc не позволяет делать объявления после кода. Code: #include <stdio.h> int main(){ char* buffer = "Hello, World!\n"; printf("%s", buffer); return 0; } Code: haos@localhost(01:33:40)~/Projects/test $ gcc -o test test.c haos@localhost(01:35:42)~/Projects/test $ ./test Hello, World! haos@localhost(01:35:44)~/Projects/test $ Code: #include <stdio.h> int main(){ printf("%s", buffer); char* buffer = "Hello, World!\n"; return 0; } Code: haos@localhost(01:36:50)~/Projects/test $ gcc -o test test.c test.c: In function ‘main’: test.c:5: error: ‘buffer’ undeclared (first use in this function) test.c:5: error: (Each undeclared identifier is reported only once test.c:5: error: for each function it appears in.) haos@localhost(01:37:07)~/Projects/test $