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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2009, 15:04   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию ASCII

Добрый день. пишу шифрование, столкнулся с такой проблемой, что при увеличении кода некоторого символа, получается что-то такое, что не отображается на экране.
Написал программку для того,, чтобы узнать, как всё-таки идёт кодировка символов:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
//---------------------------------------------------------------------------

#pragma argsused

//---------------------------------------------------------------------------
main()
{int c=0;
for (int x=0;x<20;x++)
{
        for (int y=0;y<20;y++)
        {
        cout<<c<<" _ "<<char(c);c++;
        }
cout<<endl;
};
cin.get();
};
в итоге, стало понятным, почему у меня не отображались символы: как видно из программы, точнее, из ёеё выполнения, char(3) и char(259) даст один и тот же результат.
Но у меня 1 вопрос:сколько символов кодирует ASCII? 256? (от 0 до 255)?
если так, то что означают символы с кодами:
0
255
256.
если я правильно понимаю, char(0) и char(256) даст один и тот же результат
Dimarik вне форума Ответить с цитированием
Старый 24.08.2009, 15:17   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

ASCII кодирует символы одним байтом. 256 не влезает в 1 байт(8 бит):
256дес. = 1 0000 0000дв. Отсюда видно, что если положить 256 в один байт, то он будет равен 0. Коды 0 и 255 не кодируют ничего, при выводе будет пустое место, вроде пробела, обычно их используют как ограничители(терминаторы), например в C-строках и т.д.
netrino вне форума Ответить с цитированием
Старый 24.08.2009, 15:21   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

получается, что "рабочими" являются 32-254??
Dimarik вне форума Ответить с цитированием
Старый 24.08.2009, 15:33   #4
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Если ты занимаешься шифрованием, то открывать и записывать файлы нужно с атрибутом binary, тогда рабочими будут все 256 символов.

Цитата:
Сообщение от Dimarik Посмотреть сообщение
Код:
        for (int y=0;y<20;y++)
        {
        cout<<c<<" _ "<<char(c);c++;
        }
А в консоль выводится форматированный текст со знаками перевода строки, писком спикера, и т. д.

Последний раз редактировалось ds.Dante; 24.08.2009 в 15:40.
ds.Dante вне форума Ответить с цитированием
Старый 24.08.2009, 15:38   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Я бы советовал посмотреть аски-таблицу. Рабочими являются не только они, просто часть из тех, что меньше 32 - служебные символы(например 13(возврат каретки), 10(перенос строки), 9(табуляция) и т.д.), но не все а, например 1 - улыбочка
netrino вне форума Ответить с цитированием
Старый 26.08.2009, 19:07   #6
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

подскажите плиз, как написать на с++ билдер код, чтобы каждый символ в Memo->Text увеличивался на StrToInt(Edit1->Text), но таким образом, чтобы результат был печатаемым символом? По идее нужно как-то использовать операцию деления по модулю? Но возможно ли её использовать для AnsiString? или можно обойтись без операции деления по модулю?
как я понял, нужно обойти все символвы с кодировками 0-31 и 255-..(кодировки цикличны). начиная с 256 всё повторяется с точностью, что и для кодировок, начиная с 0
Dimarik вне форума Ответить с цитированием
Старый 26.08.2009, 19:14   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Если правильно понял, вы хотите что-то такое?
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;
int len = Memo1->Text.Length();
int k = StrToInt(Edit1->Text);
AnsiString tmp ="";

for(i=1; i<=len; i++)
 {
  tmp += char(((int)Memo1->Text[i]+k)%223 + 32);
 }
Memo1->Text = tmp;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 26.08.2009, 19:26   #8
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

да. что-то такое. можешь только пояснить про преобразование типов, которые ты провёл? не очень понятно
Dimarik вне форума Ответить с цитированием
Старый 26.08.2009, 19:29   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
(int)Memo1->Text[i]+k
берем код символа и складываем с k
Код:
((int)Memo1->Text[i]+k)%223 +32
получаем остаток от деления и прибавляем 32
Код:
char(((int)Memo1->Text[i]+k)%223 + 32);
преобразуем обратно в символ.

Наверное, правильнее будет
Код:
char(((unsigned int)Memo1->Text[i]+k)%223 + 32);
(и тип k тоже на unsigned изменить).
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 27.08.2009, 11:01   #10
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
Код:
(int)Memo1->Text[i]+k
берем код символа и складываем с k
Код:
((int)Memo1->Text[i]+k)%223 +32
получаем остаток от деления и прибавляем 32
Код:
char(((int)Memo1->Text[i]+k)%223 + 32);
преобразуем обратно в символ.

Наверное, правильнее будет
Код:
char(((unsigned int)Memo1->Text[i]+k)%223 + 32);
(и тип k тоже на unsigned изменить).
ну так, спс, всё работает.
но у меня просьба ответить на 2 вопроса:
1. Поясни, пожалуйста со скобками в преобразовании типов. я чёт запутался
2. почему без преобразования типов этот код неправильно работал?
Dimarik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ascii код dollemika Помощь студентам 2 29.04.2009 20:07
ASCII коды Strogg Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 03.04.2009 17:09
paskal ascii netcher Помощь студентам 1 03.03.2009 12:45
ASCII в ANSI JRcoker Общие вопросы Delphi 5 03.08.2008 15:49
Перекодировка из ASCII Dimo444ka Помощь студентам 2 25.05.2008 13:22