• ベストアンサー

int → char → string の変換

お世話になります。 現在 VisualStudio2005 C# のコンソールアプリを作っています。 以下の場合どのようにすれば解決しますでしょうか? int code = 0xF97E; // この値をF97Eという文字(外字)にしたい 以下のように記述してみましたが、駄目でした。 int hex1 = ((code & 0xff00) >> 8); // (hex1==0xF9)になる int hex2 = (code & 0x00ff); // (hex2==0x7E)になる string s = char.ToString((char)hex1) + char.ToString((char)hex2 )); // (s==u~==0x757E)になってしまう。 原因がわかる方いらっしゃれば教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

その0xF97Eという値は、シフトJISでのコードでしょうか? .NET FrameworkはUNICODEで内部処理をしているようです。 そのためシフトJISでのコードであれば、UNICODE→シフトJISへの変換が必要となります。 サンプルです。 int code = 0xFA46; // シフトJISで「ⅶ」の文字コード byte[] b = new byte[2]; b[0] = (byte)((code & 0xff00) >> 8); b[1] = (byte)(code & 0xff); Encoding enc = Encoding.GetEncoding("Shift_JIS"); string s = enc.GetString(b) + "= 0x" +code.ToString("X"); これで、「ⅶ = 0xFA46」という文字列が作られるはずです。

参考URL:
http://www.atmarkit.co.jp/fdotnet/dotnettips/010str2byte/str2byte.html
tama_sr
質問者

お礼

なるほど! 内部的にunicodeを使っていたのですね。 解決しました。ありがとうございました。

その他の回答 (2)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★下の参考文献をどうぞ。 ・http://www.atmarkit.co.jp/fdotnet/dotnettips/010str2byte/str2byte.html→『文字列をシフトJISとしてバイト列に変換するには?』 ・http://www.atmarkit.co.jp/fdotnet/dotnettips/011byte2str/byte2str.html→『バイト列を文字列に変換するには』 ・http://www.atmarkit.co.jp/fdotnet/dotnettips/045getbytes/getbytes.html→『バイト列と数値を変換するには?』

tama_sr
質問者

お礼

リンク、参考にさせていただきます。 ありがとうございました!

回答No.1

これで出来ませんか? string s = code.ToString("X");

tama_sr
質問者

お礼

早速のご回答ありがとうございます。 この方法ですと、(s==F97E==0x46393745)となり、 "F97E"という文字列が生成されてしまいます。 今回は、"(外字)"==0xF97E という文字列を生成したい次第です。 説明がわかりにくくて申し訳ございませんでした。 よろしくお願いします。

関連するQ&A

  • 【JAVA】CharをByteに変換したい。

    JAVAで、CharをByteに変換したいです。 以下の様なメソッドを用意して通してたのですが -------------------------------------- public static byte[] Char2Bytes(char c){ int i = (int)c; return new byte[] { (byte)(i >> 8), (byte)(i & 0x00ff) }; -------------------------------------- 「a」などの場合、このメソッドを通すと「 a」となってしまいます。 他に変換する方法などないでしょうか? または、上記で「 a」とせず「a」にする方法はございますか? #byte[0]の中身が「0」であればの判定以外で

  • VC String型のエンディアン変換

    お世話になります String型の文字列のそれぞれの文字(一文字ずつ)の エンディアンを変更したいのですが、簡単な方法はないでしょうか? 今考えている方法は Stringから一文字ずつcharに入れ込んで このcharをシフトとマスクで入れ替える方法なのですが ((val<<8) & 0xff00) | ((val>>8) & 0x00ff) エンディアン変換の前後でString⇒charとchar⇒Stringを行うので、 少し煩雑になるのが気になっております。 型変換無しでエンディアン変換できないでしょうか

  • charからの型変換

    現在,計測機からUDP通信で送信される計測データをwinsockを用いて受信し解析するプログラムを書いています.受信データは16進数の数値群です. http://www.geekpage.jp/programming/winsock/udp.php こちらのコードを参考に作成し,buf配列内をdatファイルで書き出すことで受信データの確認も出来ました. しかし,解析にあたりいくつか私では解決できない問題に悩んでいるので質問させていただきます. recv関数の第二引数で指定する配列がchar型しか指定できないようで受信データが文字データとなってしまうことに悩んでいます. これをint型などの計算しやすい型に変換したいのですが,strtolやatol関数を用いても失敗してしまいます.(ASCIIに準拠していない為?) printf("%s %x",buf , buf)でbufを表示しようとしてもやはり文字化けが起こってしまいます. int型やdoubleなどの数値の型へ変化する方法をアドバイスいただけないでしょうか? datファイルで保存した受信データはこんな感じです(一部) FF EE 3D 75 62 00 C3 00 00 FF 55 00 D7 00 00 FF 5E 00 D7 00 00 FF 5A 00 C3 00 00 FF 64 00 C3 00 00 FF 62 00 EB 00 00 FF 71 00 FF 00 00 FF 69 00 FF 00 00 FF 6E 00 FF 00 00 FF 65 00 FF 00 00 FF A1 00 EB 00 00 FF A3 00 D7 00 00 FF 8C 00 FF 5C 00 FF B3 00 EB 63 00 FF AA 00 C3 00 00 FF 8F 00

  • コード変換について

    このようなS-JISからEUCにコードを変換する関数のサンプルで見つけたのですが。これを実装するにはどうすればいいのかわかりません。 unsigned int sjis2euc(unsigned int sjis) {   unsigned int hib, lob;   hib = (sjis >> 8) & 0xff;   lob = sjis & 0xff;   hib -= (hib <= 0x9f) ? 0x71 : 0xb1;   hib = (hib << 1) + 1;   if (lob >= 0x9e) {     lob -= 0x7e;     hib++;     } else if (lob > 0x7f) lob -= 0x20;   else lob -= 0x1f;   hib |= 0x80;   lob |= 0x80;   return (hib << 8) | lob; } たとえば char *str[] = "あいうえお" などとなっているにはどうやってこの関数を活用すればいいのでしょうか。

  • charで宣言した変数をstringへの代入で

    wchar_t cOrg[128]と宣言している変数にstringで宣言しているstrを cOrg[i] = str[i]; このように代入することはできたのですが、 char cAns[ 128 ]; このように宣言した変数の値をstrの41番目と42番目に 次のように入れようとするとエラーが出ます。 str[41]=cAns[1]; str[42]=cAns[2]; (エラー内容) \Form1.h(428): error C2664: 'System::String::String(wchar_t,int)' : 1 番目の引数を 'wchar_t [128]' から 'wchar_t' に変換できません。(新しい機能 ; ヘルプを参照) このような代入はできないのでしょうか? プログラムの詳細は下のようなものです。 wchar_t cOrg[128],*p; String^ str; String^ str2; int i; int iVal1,iVal2,iTotal = 0,iHosu; char cAns[ 128 ]; str = this->textBox1->Text; for(i=0;i<41;i++) { cOrg[i] = str[i]; } -------(中略)------------------------------------------ iHosu = ~iTotal; // 1の補数 iHosu++; // +1 iHosu = iHosu & 0x00FF; sprintf( cAns, "%s%02X%c", cOrg, iHosu, 0x22 ); str[41]=cAns[1]; str[42]=cAns[2];

  • c言語でintをchar*に代入

    c言語を用いてマイコンにシリアル通信経由で値を書き込もうとしています. PCからAscii(Aの場合は0x41)でマイコンにデータを送信し,マイコンで static int receivedUART[30]; 上記の変数に格納後し,書き込みのコマンドだと判断した場合に, char *kWifiSsid の変数に書き込みたいと考えています. 以下の関数を作成しました。 void setSSID(int *k){ char ssid[30] = {0}; for(int i = 0;i < SSID_LENGTH;i++){ char t; if(*k == 10){ Serial.println("brek"); break; } t = (char)*k; //最初のに2要素はコマンドのため無視 if((i != 0) && ( i != 1)){ ssid[i-2] = t; } ++k; } kWifiPass = ssid; } 上記の関数の引数にはreceivedUARTを指定しています. しかし,上記ではうまくkWifiPassが書き換えられませんでした. どのように改良すればintの値をchar*に書き込めますでしょうか?

  • char型をfloat型に変換

    GPSからシリアルポートに流れてくるコンマ区切りのフォーマットをいったんcharにいれて、トークンでぶちぶち切って、違う変数に格納したいです。 流れてくるデータは、 $GPGGA,042449.00,3449.30669291,N,13531.38645000,E,1,4,4.4,81.885,M,34.255,M,,*6D のような数値です。緯度経度や日付等のデータです。 緯度や経度の数値をfloatやdoubleに変換して変数に格納したいのですが、どうしたらよいでしょうか? そのまましたらエラーが出てしまいます。 以下は数値をブチブチ切って表示させるプログラムです。 #include <windows.h> #include <stdio.h> int main(void) { char szSend[] = "$GPGGA,000000.00,0000.00000000,N,00000.00000000,E,0,0,0.0,00.000,M,00.000,M,,*00"; char szBuf[sizeof(szSend)]="$GPGGA,042449.00,3449.30669291,N,13531.38645000,E,1,4,4.4,81.885,M,34.255,M,,*6D"; char *ptr; ptr=strtok(szBuf,","); printf("%s\n",ptr);//$GPGGA ptr=strtok(NULL,","); printf("%s\n",ptr);//時間 ptr=strtok(NULL,","); printf("%s\n",ptr);//緯度 ptr=strtok(NULL,","); printf("%s\n",ptr);//N北 ptr=strtok(NULL,","); printf("%s\n",ptr);//経度 ptr=strtok(NULL,","); printf("%s\n",ptr);//E東 ptr=strtok(NULL,","); ・ ・ ・ ・ return 0; } コンパイラはmicrosoftvisualC++6.0です。 floatとかboubleにしたいのは緯度や経度の数値を計算して扱いやすいデータにするためです。 よろしくお願いします。

  • int型の変数値をバイト列としてコピー

    あるint型の変数に格納されている情報を、バイト列としてコピーする方法で困っています。 変数の入っている領域をそのままコピーしたいので、memcpyを使うかと思うですが、 コピーされた結果を見ると文字列の並びが逆転しているように見えます。 --サンプルコード抜粋 unsigned int i= 12345; unsigned char *c; c = (char *)malloc(sizeof(int)); printf("i_hex=%x\n",i); memcpy(c,(int *)&i,sizeof(int)); 出力結果 i_hex=3039 cの出力結果 3930000000 単純にmemcpyではダメなのでしょうか? 実行環境は、CentOS(32bit)+gccです。よろしくお願いします。

  • 構造体のキャスト

    はじめまして。 C言語初心者です。今回の質問は構造体のメンバを他の構造体に格納するときにおきる不可解な現象です。 具体的には、 typedef struct gmsg{ int a; int b; int Dt[4]; }GMSG 上記のDt[4]を以下の構造体に代入していきます。 typedef struct msg{ char a; char b; char c; char d; int e; short f; char g; char h; char i; char j; char k; char l; char m; char n; short o; }MSG この際に以下のような処理を行っています。 この際GMSGを(ポインタ)pt_msgdt,(ポインタ)MSGをpt_SubDtとし、 pt_SubDt->a = (char)(pt_msgdt->Dt[0] ) & 0xFF; pt_SubDt->b = (char)(pt_msgdt->Dt[0] >>8) & 0xFF; pt_SubDt->c = (char)(pt_msgdt->Dt[0] >> 16 ) & 0xff; pt_SubDt->d = (char)(pt_msgdt->Dt[0] >> 24)& 0xff; pt_SubDt->e = (pt_msgdt->Dt[1]) & 0xFFFFFFFF; pt_SubDt->f = (short)(pt_msgdt->Dt[2] & 0xFFFF); pt_SubDt->g = (char)((pt_msgdt->Dt[2] >> 16) & 0xFF); pt_SubDt->h = (char)((pt_msgdt->Dt[2] >> 24 ) & 0xFF); pt_SubDt->i = (char)(pt_msgdt->Dt[3]) & 0xFF; pt_SubDt->j = (char)(pt_msgdt->Dt[3] >> 8) & 0xFF; pt_SubDt->k = (char)(pt_msgdt->Dt[3] >> 16) & 0xFF; pt_SubDt->l = (char)(pt_msgdt->Dt[3] >> 24) & 0xFF; pt_SubDt->m = (char)(pt_msgdt->Dt[4]) & 0xFF; pt_SubDt->n = (char)(pt_msgdt->Dt[4] >> 8) & 0xFF; pt_SubDt->o = (short)(pt_msgdt->Dt[4] >> 16) & 0xFFFF; } しかし処理結果をデバック中にDt[0],Dt[3],Dt[4]の0x79以下のデータはキャストが行いますが,0x80~0xffのデータに関しては4byteになり 0xffffff**といったキャスト結果になってしまいます。 例えると Dt[3]=0x000000f120; 処理結果 h = 0x00 g = 0x00 f = 0xFFFFF120 といった結果になってしまいます。 この結果を0x80以上でもint->char,int->shortのようにキャストく色々な方法を試しましたが、わかりません。 よろしくお願いします。 ちなみにOSはLinux,コンパイラーはC言語で扱っているデータはリトルエンディアンのバイナリデータです。

  • C# String.IndexOfのバグですか?

    C# String.IndexOfのバグですか? 非常に単純なコード String s = ",a,b,c,d,e"; int left; left = s.IndexOf(',', 0, 1); Console.WriteLine(left.ToString ()); left = s.IndexOf(',', 0, 2); Console.WriteLine(left.ToString()); left = s.IndexOf(',', 1, 1); Console.WriteLine(left.ToString()); left = s.IndexOf(',', 1, 2); Console.WriteLine(left.ToString()); 結果: 0 0 -1 2 もしかして、バグですか???

専門家に質問してみよう