Старый 03.01.2013, 13:48   #1   
mpv
 
Аватар для ATI
 
Сообщений: 1,486
Регистрация: 18.12.2006

ATI вне форума Не в сети
программка с++

Здравствуйте уважаемые!
Есть задача следующего плана: нужна программулька на с++, которая заданную информацию(текст и цифры) кодировал и выводил код ASCII в 16-тичной системе.
Мои познания с данным языком, близки к нулю(мне ближе делфи и паскаль), но все же нашел функции которые переводят один символ в код ASCII, но почему то на русские символы это не распространяется.

Вот мне бы кто-нибудь помог бы с кодом... Ну а как полученый код ASCII перевести в 16-ю систему, это я думаю, додумаюсь.
  Ответить с цитированием
Старый 03.01.2013, 14:40   #2   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,863
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от ATI Посмотреть сообщение
но почему то на русские символы это не распространяется.
в коде надо заменить все типы char на unsigned char, поможет, я гарантирую это (с)

как помочь с кодом, не совсем понятно. если в массив
unsigned char szText[1024];
загрузить текстовый файл, то к элементам массива можно обращаться как к числам (szText[0] - код первого символа)
  Ответить с цитированием
Старый 03.01.2013, 15:52   #3   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35

silly вне форума Не в сети
Цитата:
Сообщение от ATI Посмотреть сообщение
переводят один символ в код ASCII, но почему то на русские символы это не распространяется
Это потому что кириллица не входит в ASCII.

Цитата:
Сообщение от Spectator Посмотреть сообщение
как помочь с кодом, не совсем понятно.
Здесь был какой-то код?
  Ответить с цитированием
Старый 03.01.2013, 16:00   #4   
mpv
 
Аватар для ATI
 
Сообщений: 1,486
Регистрация: 18.12.2006

ATI вне форума Не в сети
silly, кода не было, потому что его по сути ещё и нет! я задачу на несколько частей разбил, и пытаюсь блоками сначала написать, а потом как-то собрать воедино.

Я конечно понимаю, что данная задача пустяковая, и то что любой программист напишет код не задумываясь за 15-20 минут, но я данного языка не знаю. и как говорится, гляжу в книгу, а вижу фигу.... а время поджимает потихоньку
  Ответить с цитированием
Старый 03.01.2013, 16:28   #5   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,863
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
вот на вид рабочий пример - как работать на сях с файлом

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
FILE *fp;
float bal[5] = { 1.1F, 2.2F, 3.3F, 4.4F, 5.5F };
int i;

/* запись значений */
if((fp=fopen("test", "wb"))==NULL) {
printf("Не удаётся отрыть файл.\n");
exit(1);
}

if(fwrite(bal, sizeof(float), 5, fp) != 5)
printf("Ошибка при записи файла.");
fclose(fp);

/* чтение значений */
if((fp=fopen("test", "rb"))==NULL) {
printf("Не удаётся отрыть файл.\n");
exit(1);
}

if(fread(bal, sizeof(float), 5, fp) != 5) {
if(feof(fp)) printf("Преждевременное достижение конца файла.");
else printf("Ошибка при чтении файла.");
}
fclose(fp);

for(i=0; i<5; i++)
printf("%f ", bal[i]);

return 0;
}


так можно узнать размер открытого файла

length=filelength(fileno(fp));

вместо float только надо работать с unsigned char

вот так мы выведем шестнадатиричные коды

for(i=0; i<length; i++)
printf("%02X ", bal[i]);
  Ответить с цитированием
Старый 04.01.2013, 16:19   #6   
mpv
 
Аватар для ATI
 
Сообщений: 1,486
Регистрация: 18.12.2006

ATI вне форума Не в сети
а может кто подскажет, как на С# сделать что бы программа на русском работала, та которую я спрашивал выше. на английском заработала
  Ответить с цитированием
Старый 04.01.2013, 17:17   #7   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35

silly вне форума Не в сети
Ты код свой покажи. И желаемый вывод (для кириллицы) тоже.
  Ответить с цитированием
Старый 04.01.2013, 17:55   #8   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Цитата:
Сообщение от ATI Посмотреть сообщение
а может кто подскажет, как на С# сделать что бы программа на русском работала, та которую я спрашивал выше. на английском заработала
Вот тебе и решение на С++, причём на русском


Код:
#include <iostream>
#include <string>
#include <locale.h>

using namespace std;

int main()
{
	setlocale(LC_ALL,"Russian"); 
	string s ("Привет, Мир! 12345");

	cout << "Исходная строка"<<endl<<s<<endl;
	cout << "Конвертированная строка"<<endl;

	cout <<hex;
	for (size_t i=0; i<s.length(); i++)
	{
		cout<<(unsigned short)s[i]<<" ";
	}

	cout <<endl;
	system("pause");
	return 0;
}
На выходе
Код:
Исходная строка
Привет, Мир! 12345
Конвертированная строка
ffcf fff0 ffe8 ffe2 ffe5 fff2 2c 20 ffcc ffe8 fff0 21 20 31 32 33 34 35
Компилил в VisualStudio 2010.
  Ответить с цитированием
Старый 04.01.2013, 18:13   #9   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35

silly вне форума Не в сети
Код:
Исходная строка
Привет, Мир! 12345
Конвертированная строка
ffcf fff0 ffe8 ffe2 ffe5 fff2 2c 20 ffcc ffe8 fff0 21 20 31 32 33 34 35
1F 04 40 04 38 04 32 04 35 04 42 04 2C 00 20 00 1C 04 38 04 40 04 21 00 20 00 31 00 32 00 33 00 34 00 35 00

С юникодом вы ТС окончательно запутаете.

А, понял. Это у нас cp1251 c лишними FF.
  Ответить с цитированием
Старый 04.01.2013, 18:34   #10   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Цитата:
Сообщение от silly Посмотреть сообщение
С юникодом вы ТС окончательно запутаете.

А, понял. Это у нас cp1251 c лишними FF.
Да, меня это тоже смутило, но думаю при желании можно "доработать" и убрать лишние FF.
  Ответить с цитированием
Старый 06.01.2013, 13:03   #11   
mpv
 
Аватар для ATI
 
Сообщений: 1,486
Регистрация: 18.12.2006

ATI вне форума Не в сети
здесь была лажа...

Последний раз редактировалось ATI; 11.01.2013 в 20:55.
  Ответить с цитированием
Старый 06.01.2013, 14:00   #12   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35

silly вне форума Не в сети
Да уж. Это не лечится.
  Ответить с цитированием
Старый 11.01.2013, 20:55   #13   
mpv
 
Аватар для ATI
 
Сообщений: 1,486
Регистрация: 18.12.2006

ATI вне форума Не в сети
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
byte[] textBytes = Encoding.ASCII.GetBytes(textBox1.Text);
foreach (byte b in textBytes)
textBox2.Text += Convert.ToString(b,16) + ".";

}
}
}


предыдущее сообщение не в тему
  Ответить с цитированием
Старый 11.01.2013, 21:31   #14   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,863
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
я понял в чем проблема. в этой гадости (это не С++, это C#) устанавливается как то кодировка по умолчанию, возился как-то давным давно, тоже сталкивался с подобными проблемами.

Экземпляр http://msdn.microsoft.com/en-us/libr....encoding.aspx вот этого класса, сконструированный с русской кодировкой, нужно куда то по умолчанию прикрутить.

вот так я читал файлы кажись

StreamReader sr = new StreamReader("C:\\text.txt",false,System.Text.Enco ding.GetEncoding(1251));
  Ответить с цитированием
Старый 11.01.2013, 22:10   #15   
mpv
 
Аватар для ATI
 
Сообщений: 1,486
Регистрация: 18.12.2006

ATI вне форума Не в сети
Spectator, а как мне всё это дело заточить под с++ не подскажешь?
  Ответить с цитированием
Старый 11.01.2013, 22:47   #16   
Форумец
 
Сообщений: 331
Регистрация: 24.12.2005

Godric вне форума Не в сети
вот смотри, разве не то, что нужно?

#include <stdio.h>

int main(int argc, char* argv[])
{
for(int i=0; i<256;i++)
{
unsigned char ch=(char)i;
printf(" hex= %x char= %c \n",ch,ch);
}

return 0;
}

  Ответить с цитированием
Старый 11.01.2013, 22:48   #17   
mpv
 
Аватар для ATI
 
Сообщений: 1,486
Регистрация: 18.12.2006

ATI вне форума Не в сети
и ещё, есть ли какая-нибудь команда типа "string" но только что бы строка понималась не как отдельные символы юникода, а как отдельные символы ascii?
  Ответить с цитированием
Старый 11.01.2013, 22:55   #18   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,863
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от ATI Посмотреть сообщение
и ещё, есть ли какая-нибудь команда типа "string" но только что бы строка понималась не как отдельные символы юникода, а как отдельные символы ascii?
char sz[2]="A";
sz[0]='Z';


?????
  Ответить с цитированием
Старый 11.01.2013, 23:01   #19   
mpv
 
Аватар для ATI
 
Сообщений: 1,486
Регистрация: 18.12.2006

ATI вне форума Не в сети
Godric, что-то это у меня вообще не работает(((
пищит как зверюга и всё(
и я вообще не догоняю, где тут переменные определяются и задаются
  Ответить с цитированием
Старый 11.01.2013, 23:07   #20   
Форумец
 
Сообщений: 331
Регистрация: 24.12.2005

Godric вне форума Не в сети
ATI, ты в какой IDE собираешь проект? Если у тебя стоит Visual Studio (как я понимаю стоит, раз шарпом пользуешься), то создай пустой проект с++ и все должно собраться. По поводу переменных не понял. ты опиши что именно тебе нужно, какая постановка задачи? Ввести текст или цифры в консоль, а программа должна выдать шестнадцатиричное представление для каждого введенного символа? Или что?
  Ответить с цитированием
Старый 11.01.2013, 23:12   #21   
mpv
 
Аватар для ATI
 
Сообщений: 1,486
Регистрация: 18.12.2006

ATI вне форума Не в сети
#include <iostream>
#include <string>
#include <locale.h>

using namespace std;

int main()
{
char s;
setlocale(LC_ALL,"Russian");
cout<<"введите исходный текст"<<endl;
cin>>s
string s ;

cout << "преобразованный текст"<<endl;

cout <<hex;
for (size_t i=0; i<s.length(s); i++)
{
cout<<(unsigned short)s[i]<<" ";
}

cout <<endl;
system("pause");
return 0;
}


не работает(((((
поправте дурака, курсяк через неделю, а так получилось что тему узнал буквально недавно, не понимаю что от меня хотят вообще, так и плюс ко всему программа эта нужна на с++, а я сталкивался только с BASIK и Pascal. прочитал руководство для начинающих с++ Шилдта, но как-то мне это не много дало, только начинаю понимать немного что есть что в коде, но какие пишу, не работают
  Ответить с цитированием
Старый 11.01.2013, 23:16   #22   
mpv
 
Аватар для ATI
 
Сообщений: 1,486
Регистрация: 18.12.2006

ATI вне форума Не в сети
Godric, задача состоит в том, что мне нужна "простая" программа перевода заданного текста в 16-тиричный код ASCII, к которой мне надо будет написать нечто, типа паспорта, т.е. расписать её задачи, как работает, внешнее и внутреннее описание программной среды и т.д.
  Ответить с цитированием
Старый 11.01.2013, 23:37   #23   
Форумец
 
Сообщений: 331
Регистрация: 24.12.2005

Godric вне форума Не в сети
ATI,

#include <iostream>
#include <string>
#include <stdio.h>


int main()
{
std::setlocale( LC_ALL, "Russian" );
std::cout << "Enter text:" << std::endl;
std::string input_string;
std::cin >> input_string;
std::cout << "Result:" << std::endl;

for (size_t i = 0; i < input_string.length(); ++i)
{
printf("%x ", (unsigned char)input_string[i]);
}
std::cout << std::endl;
return 0;
}

самый простой вариант. Можно еще не использовать printf, так как это все таки С а не С++
  Ответить с цитированием
Старый 11.01.2013, 23:44   #24   
mpv
 
Аватар для ATI
 
Сообщений: 1,486
Регистрация: 18.12.2006

ATI вне форума Не в сети
Godric, спасибо!!!! работает с английским. теперь попытаюсь разобраться куда засунуть в Visual Studio что бы получить форму уже, а так через DEV-c++ открылось всё и заработало в консольном виде с английским, с русским не проверял по таблице ASCII
  Ответить с цитированием
Старый 11.01.2013, 23:55   #25   
Форумец
 
Сообщений: 331
Регистрация: 24.12.2005

Godric вне форума Не в сети
ATI, и русский должен работать. Вот еще вариант, получше будет.


#include <iostream>
#include <string>
#include <stdio.h>


int main()
{
std::setlocale( LC_ALL, "Russian" );
std::cout << "Enter text:" << std::endl;
std::string input_string;
getline(std::cin, input_string);
std::cout << "Result:" << std::endl;

for (size_t i = 0; i < input_string.length(); ++i)
{
uint32_t ch = input_string[i];
ch &= 0xFF;
std::cout << std::hex << ch << " ";
}
std::cout << std::endl;
return 0;
}

Разбирайся, удачи, стране нужны специалисты )))))))
  Ответить с цитированием
Старый 12.01.2013, 00:05   #26   
mpv
 
Аватар для ATI
 
Сообщений: 1,486
Регистрация: 18.12.2006

ATI вне форума Не в сети
Godric, спасибо большое ещё раз! оба варианта работают отлично, как на русском так и на английском языке!
  Ответить с цитированием
Старый 12.01.2013, 00:07   #27   
Форумец
 
Сообщений: 331
Регистрация: 24.12.2005

Godric вне форума Не в сети
ATI, студии под рукой нет, но теоретически у тебя на форме будет текстовое поле для ввода текста, кнопка и лейбл для вывода результата. После ввода текста пользователь нажмет на кнопку, получаешь текст из текстового поля в строку, например: std::string input_text. далее вызывай функцию:

std::string input_string_to_hex(const std::string& input_string)
{
std::stringstream result;
for (size_t i = 0; i < input_string.length(); ++i)
{
uint32_t ch = input_string[i];
ch &= 0xFF;
result << std::hex << ch << " ";
}
return result.str();
}

вызываешь соответсвенно вот так:

std::string result = input_string_to_hex(input_string);

все, далее выводи result в Label и все. Дальше дело красоты и удобства для пользователя
  Ответить с цитированием
Старый 12.01.2013, 00:09   #28   
Форумец
 
Сообщений: 331
Регистрация: 24.12.2005

Godric вне форума Не в сети
ATI, пожалуйста. Код не сложный, думаю разберешься ))
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind