0 / 0 / 0
Регистрация: 16.12.2009
Сообщений: 35
1

Преоброзование строки в байты

30.03.2011, 00:10. Показов 13405. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача заключается в следующем , поле Edit заполняется допустим такой последовательность 589792,
допустим что это ввели пароль, дальше программа должна взять данные из поля Edit и преобразовать это в массив байт 5(53) 8(56) 9(57) 7(55) 9(57) и тд короче преобразовать каждое число в строке в его ANSII код и записать в массив для дальнейшего выполнения криптографических функций .
Чета не как не пойму как это сделать
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.03.2011, 00:10
Ответы с готовыми решениями:

Строки в байты
Есть байтовый код: "Ы°СДЫЭНC" читая его через local file =...

Строки и байты
Есть некая программа Значения в строке(STR) HEX КОДЫ (ПРИМЕР 06 41 6F) 1 Вопрос, как...

Написать программу, которая бы считывала из входного файла байты с N1 по N2 и с N3 по N4 и записывала эти байты в выходной файл
Здравствуйте!В убунту на Си нужно написать программу, которая бы считывала из входного файла байты...

Разные байты у одной строки
Всем привет. Есть следующий извращенный алгоритм. Требуется, строку перевести в biginteger и...

17
7 / 7 / 0
Регистрация: 06.08.2010
Сообщений: 12
30.03.2011, 01:15 2
Преобразуешь число в строку и потеешь дальше.
(Если я правильно перевел вопрос с русского)
0
0 / 0 / 0
Регистрация: 16.12.2009
Сообщений: 35
30.03.2011, 01:20  [ТС] 3
Не понял, мне нужно нужно наоборот строку преобразовать в последовательность байт (ANSII) кодировки строки
0
LK
Заблокирован
30.03.2011, 03:24 4
Есть масив символов (строка).
Например unsigned char textkey="00112233445566778899aabbcc ddeeff". (Ключ для шифрования, если спросите, что это и зачем).

Для дальнейшей работы надо этот масив символов сделать масивом соответствующих байт, а то есть char bytekey={0x00,0x11,0x22,...,0xee,0x ff}.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <string.h>
 
void uch_to_hex(unsigned char Ch, char *szRes)
{
    char res[] = "0x00";
    if(Ch / 16 < 10)
        res[2] = Ch / 16 + '0';
    else
        res[2] = Ch / 16 + 'A' - 10;
    if(Ch % 16 < 10)
        res[3] = Ch % 16 + '0';
    else
        res[3] = Ch % 16 + 'A' - 10;
    strcpy(szRes, res);
}
из каждых двух симвлов строки получить один соответствующий байт.
То есть, если string str="ff", char byte=0xff, а не "0xff".
C++
1
2
3
4
unsigned char str_to_hex(const char *szstr)
{
      return ((szstr[0] > '9' ? szstr[0]-'a' : szstr[0]-'0')*16 + (szstr[1] > '9' ? szstr[1]-'a' : szstr[1]-'0'));
}
код не мой, не проверял
0
+1
345 / 178 / 53
Регистрация: 24.08.2010
Сообщений: 1,028
30.03.2011, 05:27 5
Как всегда, ассемблер рулит )))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    AnsiString asIn = Edit1->Text;
    int iOut;
        _asm {
        push eax
        push ebx
        mov eax,&asIn
        mov ebx,[eax]
        and ebx,0xFF
        mov iOut,ebx
        pop ebx
        pop eax }
    Edit2->Text=iOut;
}
Здесь перевод по одному символу, дальше не сложно.
1
0 / 0 / 0
Регистрация: 16.12.2009
Сообщений: 35
30.03.2011, 10:43  [ТС] 6
Цитата Сообщение от +1 Посмотреть сообщение
Как всегда, ассемблер рулит )))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    AnsiString asIn = Edit1->Text;
    int iOut;
        _asm {
        push eax
        push ebx
        mov eax,&asIn
        mov ebx,[eax]
        and ebx,0xFF
        mov iOut,ebx
        pop ebx
        pop eax }
    Edit2->Text=iOut;
}
Здесь перевод по одному символу, дальше не сложно.
Да,действительно рулит, но только первый символ в строке, а как преобразовать всю строку, я так понимаю нужно определить её длину и в цикле все конвертировать, но я в асме не селен , может подскажите как?
Я думал что есть функция для таких задач, оказывается все сложней,нужно городить свою функцию, неужели это такая редкая задача.

Добавлено через 10 минут
Ещё одна непонятка, допустим в поле Edit ввели имя, мне его нужно сохранить , но так как в С++ нет переменной типа String как в Delphi , то имя введенной в поле Edit, мне нужно сохранить в массив типа Char, как это сделать? Чето после Delphi я туго понимаю как работать со строками в С++Builder
0
+1
345 / 178 / 53
Регистрация: 24.08.2010
Сообщений: 1,028
30.03.2011, 11:08 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    AnsiString asTemp, asIn = Edit1->Text;
    int iTemp, iOut[5];
 
    Memo1->Lines->Add(" ");
    for (int i=0; i<asIn.Length();i++)
        {
        asTemp=asIn.SubString(i+1,1);
        _asm {
        push eax
        push ebx
        mov eax,&asTemp
        mov bx,[eax]
        and ebx,0xFF
        mov iTemp,ebx
        pop ebx
        pop eax }
        iOut[i]=iTemp;
        Memo1->Lines->Add(IntToStr(iTemp));
        }
}
Типа так.
В С++ строка сохраняется в переменную типа AnsiString.
AnsiString asIn = Edit1->Text;
1
0 / 0 / 0
Регистрация: 16.12.2009
Сообщений: 35
30.03.2011, 12:05  [ТС] 8
+1 спасибо вам. Все работает как надо.
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,879
Записей в блоге: 1
30.03.2011, 13:06 9
Чё-то замудрили с ассемблером. Всё гораздо проще:
Можно перевести текст из Edit в char[]. В каждом индексе этого массива будет храниться ASCII код символа, но чтобы его вывести на экран, нужно в int перевести.
C++
1
2
3
4
5
6
7
8
        char text[100];
        strcpy(text, Edit1->Text.c_str() );
        int len = strlen(text);
 
        for (int i=0; i<len; i++)
        {
                Memo1->Lines->Add( (int)*(text+i) );
        }
0
0 / 0 / 0
Регистрация: 16.12.2009
Сообщений: 35
30.03.2011, 17:47  [ТС] 10
Ваш вариант выводит кракозябры
0
Покинул форум
3187 / 1366 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
30.03.2011, 19:32 11
Цитата Сообщение от Zemlyanov Посмотреть сообщение
Задача заключается в следующем , поле Edit заполняется допустим такой последовательность 589792,
допустим что это ввели пароль, дальше программа должна взять данные из поля Edit и преобразовать это в массив байт 5(53) 8(56) 9(57) 7(55) 9(57) и тд короче преобразовать каждое число в строке в его ANSII код и записать в массив
Для примера:
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String s;
 
for(int i=1;i<Edit1->Text.Length()+1;i++)
{
s=s+String( int(Edit1->Text[i]));
}
ShowMessage(s);
}
//---------------------------------------------------------------------------
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
30.03.2011, 20:08 12
Цитата Сообщение от Zemlyanov Посмотреть сообщение
дальше программа должна взять данные из поля Edit и преобразовать это в массив байт
Может я что-то не так понимаю, но строка вроде бы и так есть массив байтов

И покажи результат выдачи с использованием ассемблерной вставки, который тебя устроил. Чтобы хоть понимать, чего конкретно ты хочешь

Добавлено через 2 минуты
Тот, кто придумал ассемблерную вставку ради того, чтобы наложить маску 0xff, жжёт просто неимоверно. Удивляюсь, как при этом обошёлся без использования OpenGL или без требования программы вставить дискету
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,879
Записей в блоге: 1
30.03.2011, 20:39 13
Zemlyanov
Не может быть такого. Проверял, перед тем как код вставлял.
Если стоит rad studio xe, то можно так попробовать:
C++
1
2
3
4
5
6
7
8
char text[100];
strcpy(text, AnsiString(Edit1->Text).c_str() );
int len = strlen(text);
 
for (int i=0; i<len; i++)
{
    Memo1->Lines->Add( (int)text[i] );
}
0
LK
Заблокирован
30.03.2011, 22:21 14
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Zemlyanov
Не может быть такого. Проверял, перед тем как код вставлял.
Если стоит rad studio xe, то можно так попробовать:
C++
1
2
3
4
5
6
7
8
char text[100];
strcpy(text, AnsiString(Edit1->Text).c_str() );
int len = strlen(text);
 
for (int i=0; i<len; i++)
{
    Memo1->Lines->Add( (int)text[i] );
}
если RAD XE, то, вероятнее всего wchar_t и wcscpy, wcslen, не путайте народ.
0
79 / 79 / 20
Регистрация: 13.05.2009
Сообщений: 537
Записей в блоге: 1
31.03.2011, 00:21 15
для изобретателей велосипеда

C++
1
2
3
4
for (int i=0; i<Edit1->Text.Length(); i++)
        {
                Memo1->Lines->Add(IntToStr(((int)(Edit1->Text[i+1]))));
        }
0
LK
Заблокирован
31.03.2011, 01:02 16
Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
для изобретателей велосипеда
C++
1
2
3
4
for (int i=0; i<Edit1->Text.Length(); i++)
  {
    Memo1->Lines->Add(IntToStr(((int)(Edit1->Text[i+1]))));
}
данное решение предложил уважаемый NiTan, стоило более внимательно просмотреть тему.
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,879
Записей в блоге: 1
31.03.2011, 04:35 17
не забыли, что при каждом проходе в цикле будет вызываться метод Length()?
0
LK
Заблокирован
31.03.2011, 04:41 18
детали реализации...
0
31.03.2011, 04:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2011, 04:41
Помогаю со студенческими работами здесь

Отличить числовые байты от строки utf-8
Здравствуйте! Подскажет, как в шарпе отличить числовые байты от строки utf-8? Вообщем, у меня...

Преобразование строки в байты: оптимизировать алгоритм
Часть программы .... которая строку(довольно большую) содержащую 0 и 1 преобразует в байты( читает...

Декодировать байты (в base64) в просто байты
Добрый день, нужно декодировать байты, которые зашифрованы в base64 в нормальные баты вот код : ...

Конвертирование строки в байты через getBytes(encoding), странные результаты
public static void main(String args) throws UnsupportedEncodingException { String...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru