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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

23398閲覧

C# 任意のbyte配列とstringの変換

l---1cm---l

総合スコア13

C#

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2016/10/08 10:19

編集2016/10/08 10:19

C#で、任意のbyte配列をstring型に直接変換、および逆変換することは可能でしょうか。
ここで言う「任意のbyte配列」とは、必ずしも文字コードに従っていない任意のバイナリデータのことです。

文字コードを介すと下のコードのようになってしまい、きちんと変換されません。UTF8以外でも同様です。

なぜこんなおかしなことをしたいのかというと、現在UnityでAndroidアプリの開発を行っているのですが、
JavaライブラリからUnityの関数を呼ぶとき、引数にstringしか使えないためです。
(UnityPlayer#UnitySendMessage(string, string, string);)

Base64で変換して渡すことも考えましたが、もし直接変換する方法があればと思い、質問させていただきました。
よろしくお願いいたします。

C#

1using System; 2public class Test { 3 public static void Main() { 4 5 /* 任意のbyte配列 */ 6 byte[] bin_data = new byte[]{ 0x12, 0x34, 0x7F, 0x80, 0xAB, 0xCD }; 7 Console.WriteLine("bin_data = " + toString(bin_data)); 8 // [出力] bin_data = 12 34 7F 80 AB CD 9 10 /* 任意のbyte配列をstringに変換した後、逆変換 */ 11 byte[] conv_data = StringToBytes(BytesToString(bin_data)); 12 Console.WriteLine("conv_data = " + toString(conv_data)); 13 // [出力] conv_data = 12 34 7F EF BF BD EF BF BD EF BF BD ←bin_dataと同じにしたい!!! 14 15 } 16 17 /* byte配列→string */ 18 static string BytesToString(byte[] bytes) { 19 return System.Text.Encoding.UTF8.GetString (bytes); 20 } 21 /* string→byte配列 */ 22 static byte[] StringToBytes(string str) { 23 return System.Text.Encoding.UTF8.GetBytes (str); 24 } 25 /* byte配列の文字列表現(適当です!) */ 26 static string toString(byte[] bytes) { 27 string ret = ""; 28 foreach (byte b in bytes) { 29 ret += b.ToString ("X2") + " "; 30 } 31 return ret; 32 } 33}

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。
C#の内部文字コードはUnicodeで一文字2byteなので、「byte配列の長さが偶数個であれば」、Unicodeでそのまま変換すれば意図したものが得られるはずです。

csharp

1/* byte配列→string */ 2static string BytesToString(byte[] bytes) { 3 return System.Text.Encoding.Unicode.GetString (bytes); 4} 5/* string→byte配列 */ 6static byte[] StringToBytes(string str) { 7 return System.Text.Encoding.Unicode.GetBytes (str); 8}

このコードはbyte配列長が奇数だと結果がぶっ壊れるので、まあ、使い物にならないですね。
なので、素直に1byteを1文字に割り当てて変換してしまえばいいでしょう。
次のコードで目的は達成できるでしょうか。

csharp

1/* byte配列→string */ 2static string BytesToString(byte[] bytes) { 3 return new string(bytes.Select(x => (char)x).ToArray()); 4} 5/* string→byte配列 */ 6static byte[] StringToBytes(string str) { 7 return str.Select(x => (byte)x).ToArray(); 8}

投稿2016/10/11 23:48

tamoto

総合スコア4103

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

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

l---1cm---l

2016/10/14 13:32

ありがとうございます。むしろ前者の方が私の目的には使えそうです。 Unicodeだと2byte分のデータを直接変換できるのですね。パケット的にデータ長とデータ部をまとめて送れば、奇数要素問題は適当なデータを埋めることで解決できそうです。 また、後者の方法では変換効率は50%となるので私の理想からは少し外れますが、LINQは使ったことがないので勉強になりました。
guest

0

BitConverter で期待する結果は得られるのではないでしょうか。

投稿2016/10/08 15:04

nakit

総合スコア410

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

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

l---1cm---l

2016/10/11 09:52

なるほど、BitConverterのToChar(byte), GetBytes(Char)ですね。 直接stringとの変換はできないみたいですが(ToString(byte[])は違うみたいですね) 、ちょっと試してみます。
nakit

2016/10/11 14:25

ToString(byte[])のつもりで回答しました。 byte配列をstringに変換したいのですよね?なぜ違うと判断されたのでしょうか。 もし区切り文字のハイフンの形式が合わないとしても置換するなどしていくらでも希望の形式に加工できるのではないでしょうか。
l---1cm---l

2016/10/14 13:18

質問の意図が分かりづらく申し訳ありません。 確かにBitConverter#ToString(byte[])でbyte配列を文字列で表現できるのですが、できるだけメモリ的に効率的に格納したいと思い、質問させていただいた次第です。ToString(byte[])を使うと1byteがchar1文字分(2byte)、つまり50%の変換効率(ハイフンも加えるなら計4byteの効率25%)で表現されることになるので、ちょっと違うと思ってしまいました。 理想は元のバイト列をそのままstringのメモリ上にコピーするイメージで、C言語ならメモリを直接弄ればいけそうですが、C#でも何か方法はないかと思ったのがきっかけです。 せっかく回答いただいたのに私の質問の仕方が悪かったです。すみません。
l---1cm---l

2016/10/14 13:30

すみません、細かいことですが↑の変換効率が間違ってました。 ToString(byte[])は1byteがchar2文字分(=4byte)になるので効率25%、ハイフンを入れると効率17%ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問