преобразование типов — Ошибка при преобразовании строки из EBCDIC в ASCII в C / Stack Overflow

Я пишу код C ++ для преобразования ebcdic в ascii
Мой main () показан ниже

int main()
{
char text[100];
int position;
int count;

printf("Enter some text\n");
cin >> text;

char substring[] = "\\x";
if(strlen(text)  2 != 0)
{
cout << "Length of the string is not even" << endl;
}
else
{
position = 1;
int len_string;
len_string = strlen(text)/2;
cout<<"len_string"<<len_string<<endl;

for (count = 0; count < len_string;count++)
{
insert_substring(text, substring, position);
printf("text is s\n",text);
position  = position + 4;
}
}

ebcdicToAscii((unsigned char*)text);
cout << "Converted text" <<text << endl;

char str[]="\xF5\x40\x40\x40\x40\xD4"; //Hardcoded string
ebcdicToAscii((unsigned char*)str);
printf ("converted str is s\n", str);

return 0;
}

Выход:

    Enter some text
F54040404040D4
len_string7
text is \xF54040404040D4
text is \xF5\x4040404040D4
text is \xF5\x40\x40404040D4
text is \xF5\x40\x40\x404040D4
text is \xF5\x40\x40\x40\x4040D4
text is \xF5\x40\x40\x40\x40\x40D4
text is \xF5\x40\x40\x40\x40\x40\xD4
Converted text**?*?*?*?*?*
converted str is 5    M

Перед преобразованием мне нужно добавить \ x перед строкой

Пример:

F540404040D4 должен вставлять escape-последовательность \ x

Я написал логику, поэтому я получил вывод:

\xF5\x40\x40/x40\x40\xD4

Теперь преобразование ebcdic в ascii начинает использовать

ebcdicToAscii((unsigned char*)text);

Но я не получаю желаемый результат.

В то же время, когда я жестко закодировал строку как

\xF5\x40\x40/x40\x40\xD4

выход как и ожидалось

т.е.
5 М

Я сбит с толку. Пожалуйста, ведите меня. Я не показывал вызываемые функции в коде, предполагая, что он дает правильный возврат.

-1

Решение

Вы не должны вставлять \x во введенной строке и, кстати, с или без вставки, это не будет работать.

Вот:

char str[]="\xF5\x40\x40\x40\x40\xD4";

это просто признак того, что, например, F5 является шестнадцатеричным числом, и следует использовать символ с этим кодом ASCII (а не только символы F и 5).
Смотрите здесь для получения дополнительной информации: Что означает \ x в c / c ++?

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

Для конвертации вы можете использовать, например, следующий код:

#include <iostream>
#include <string>

int main()
{
const std::string s ="F540404040D4";
std::string converted;
converted.reserve(s.size() / 2);
for (size_t i = 0; i < s.size(); i += 2)
{
const std::string tmp = s.substr(i, 2);
const int a = std::strtol(tmp.c_str(), 0, 16);
converted += static_cast<char>(a);
}
std::cout << converted.size() << std::endl;
}
1

Другие решения


По вопросам рекламы [email protected]