-1

私はebcdicをasciiに変換するためのc ++コードを書いています
私の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エスケープ シーケンスを挿入する必要があります \x

私はロジックを書いたので、出力を得ました:

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

これで、ebcdic から ascii への変換が開始されます

ebcdicToAscii((unsigned char*)text);

しかし、私は望ましい出力を得ていません。

文字列を次のようにハードコーディングすると同時に

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

出力は期待どおりです

すなわち5M

私は混乱しています。ガイドしてください。呼び出された関数が適切な戻り値を返すと仮定して、コード内に呼び出した関数を示していません。

4

1 に答える 1

1

入力された文字列に挿入するべき\xではありません。ちなみに、挿入の有無にかかわらず、それは機能しません。

ここ:

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

たとえばF5、このASCIIコードの16進数と文字を使用する必要があることを示しています(記号Fと5だけではありません)。詳細については、ここを参照してください: \x は c/c++ で何を意味しますか?

シンボルだけでなく、ASCIIコードに各2バイトを使用して、入力から文字列を作成する必要があります。

変換には、たとえば次のコードを使用できます。

#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;
}
于 2015-07-30T11:48:26.713 に答える