質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

3回答

1983閲覧

C#でint型桁以上(膨大な桁)の2進数を日本語に効率よく変換する方法

dendenmushi

総合スコア98

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2018/08/26 08:19

編集2018/08/26 13:47

前提・実現したいこと

C#で2進数から日本語を表示したい。

(具体例)
こんにちは

2進数
『111000111000000110010011111000111000001010010011111000111000000110101011111000111000000110100001111000111000000110101111』
↓ ←この部分を実現したいです。
こんにちは

イメージとしてWEBページ計算サイトで行うと…

下記サイトで2進数を16進数へ
https://hogehoge.tk/tool/number.html

下記サイトで16進数を日本語へ
https://kujirahand.com/web-tools/Hex.php

これをC#で行いたいと考えています。
非常に長い2進数でも対応できるコードになります。

発生している問題・エラーメッセージ

int.Parseメソッドのところで以下エラーが出てしまいます。

+ $exception {"Int32 型の値が大きすぎるか、または小さすぎます。"} System.OverflowException

該当のソースコード

       //2進数をstringへ string ostin = "10000010101010010101111100011110101"; //stringをintへ //int i = int.Parse(ostin); //intをbyte配列へ byte[] byteArray = BitConverter.GetBytes(i) //byte配列を16進数へ string num16 = WindowsFormsApp2.PrimitiveExtension.ToHexString(bytes); // 16進数文字列を数値へ int charCode16 = Convert.ToInt32(charCode, 16);        // 数値(文字コード) を文字へ char c = Convert.ToChar(charCode16);        // 「文字列」 string newChar = c.ToString();

試したこと

トライ①long型に変換をエラー箇所で試しましたが結果的にint型が必要なために断念。
トライ②string型をbyte配列に変換する方法を取り、

C#

1 string strVal = ostin; 2 byte[] bytes; 3 bytes = Encoding.ASCII.GetBytes(strVal); 4 5 foreach (byte b in bytes) 6 { 7 Console.Write(string.Format("{0,3:X2}", b)); 8 } 9 10 //byte配列を16進数にダンプ 11 string num16 = WindowsFormsApp2.PrimitiveExtension.ToHexString(bytes); 12       //16進数文字列を数値へ 13 string charCode = "num16"; 14 int charCode16 = Convert.ToInt32(charCode, 16); 15       //数値(文字コード)を文字へ 16 char c = Convert.ToChar(charCode16); // 数値(文字コード) -> 文字 17 string newChar = c.ToString(); 18 19

Convert.ToInt32下記エラー
'''

  • $exception {"認識可能な数値が見つかりませんでした。"} System.FormatException

'''

トライ③BigInteger…

2進数から端的にASCIIコードを利用して日本語に変換できるものだと思っていたのですがかなり苦戦してます。そもそもC#にはそういったライブラリなど用意していないものなのでしょうか。大きいintになった場合はどういった処理をしていいものなのでしょうか。よろしくお願い致します。

補足情報(FW/ツールのバージョンなど)

visual studio 2017
C#
win10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

ループで8文字づつ切り出して
Convert.ToByte(切り出した文字,2)
でバイト配列作って、
適切なEncoderで文字列化すればいいのでは?
例)UTF8の場合

C#

1string text = System.Text.Encoding.UTF8.GetString(data);

提案したままを書くとこんな感じですかね

C#

1 String src = "111000111000000110010011111000111000001010010011111000111000000110101011111000111000000110100001111000111000000110101111"; 2 3 byte[] data = new byte[src.Length / 8]; 4 5 for(int i=0; i<data.Length; i++) 6 { 7 data[i] = Convert.ToByte(src.Substring(i * 8, 8), 2); 8 } 9 10 String test = System.Text.Encoding.UTF8.GetString(data); 11

投稿2018/08/26 13:53

編集2018/08/26 15:05
YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dendenmushi

2018/08/26 14:26

すいません。なるほどです。ありがとうございます。やってみます。
dendenmushi

2018/08/26 16:50

すごい…わたしは40行くらいにforやらifやら使って書いて冗長な記述でしたが、7行で実現できるのですね…。ありがとうございました。
dendenmushi

2018/08/27 11:06

ちなみになのですが…日本語を一回で2進数に変換できるものとして書いたのですが、桁数が異様に少ないようでこれはただの2進数ではないのでしょうか。もしよろしければご助言お願い致します。 string binary_data = WindowsFormsApp2.decimal_transform.Decimal_transform_Method(input_data);
YAmaGNZ

2018/08/27 11:13

decimal_transform.Decimal_transform_Methodって何ですか?
dendenmushi

2018/08/27 11:56

どこかで拾って眠っていたメソッドで2進数らしきもので返していましたが、実際の2進数より短かったので何か違う種の2進数などがあるのかなと感じていました。よくわからないメソッドを呼び込んでいただけのようです…すいませんお騒がせしました…。
YAmaGNZ

2018/08/27 12:29

そのメソッドが2進数を返すとしてですが 可能性として考えられるとすれば、10進数の5が”101”と変換され、頭の方が0埋めされていない 今回の場合、”00000101”を期待しているので、桁数が少ないとかじゃないですかね?
guest

0

Convert.ToInt32(ostin, 2);

手元でやったら、失敗しました。桁数が長すぎる??

仕方が無いので、いつもの方法 ([追記] int → ulong としないと正しい結果にならないですね)

C#

1int result = 0; 2foreach (char c in ostin) { 3 result <<= 1; 4 if (c == '1') result += 1; 5} 6

こちらは、当たり前ですが、動きました。 期待するコードではないかも知れませんが。

[追記]
もしやと思って、

C#

1ulong result1 = Convert.ToUInt64(ostin, 2);

としたら、 "4154AF8F5" となりました。 単なる桁数オーバー

投稿2018/08/26 08:42

編集2018/08/26 11:35
pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dendenmushi

2018/08/26 13:47 編集

ありがとうございます。例えば『こんにちは』は、2進数ですと『111000111000000110010011111000111000001010010011111000111000000110101011111000111000000110100001111000111000000110101111』ですが、これも桁数オーバーになってしまいました。C#で書いて頂いたコードの意味がまだちょっとわかっていないです。どうすれば日本語化できるか悩んでおります。
dendenmushi

2018/08/26 16:52

解決できました。アドバイスありがとうございました。
guest

0

C#

1Convert.ToInt32(ostin, 2);

投稿2018/08/26 08:33

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dendenmushi

2018/08/26 16:53

アドバイスありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問