2017-03-21 18 views
0

私はC#でコーディングしていて、安全ではない/固定されたコードを使用しています。C#で文字列[]に変換する

バイト[]から文字列[]に変換したいと考えています。私は文字列のファイル(\ nで終了)から始めました。私はファイルから読み込んだバイト配列の\ nをすべて\ nに置き換えました。改行が\ 0になったので、バイト[]を文字列[]として再解釈するかもしれないと思った。私はそれが意味をなさないと思うが、私は間違っている可能性がある。私がC++(数十年前、残念なことに)を思い出すと、文字列[]はちょうどchar [] []で、それぞれの内部char []はnullで終了します。だから、私は(ファンシーキャスト)をすることができれば、以下のコードがうまくいくと思う。

//ファイルには、各ライン

byte[] bytes = ReadFile(); 
Replace(bytes, '\n', \0'); 
string[] strings = (fancycast)bytes 

私は(fancycast)を行う方法がわからないの文字列が含まれています。どうもありがとうございました。

私はC#のすべてのストリームと読者について知っていますが、なぜ私がそれらを使用しないのかについての具体的な理由があります。別のデザインを提案しないでください。私はちょうど配列のキャストを再解釈したいと思う。ご協力ありがとうございました。

+0

.Net文字列はnullで終了しないため、バイト配列は必要ありません。 'string result = File.ReadAllText(file).Replace( '\ n'、 '\ 0')' – Slai

答えて

1

C#はC文字列ではなくPASCAL文字列を使用します。おそらく\n文字だけを残して、Split()を実行するのが最良の方法です。あなただけのC#でファイルを読みたい場合は

byte[] bytes = ReadFile(); 
string oneBigString = Encoding.ASCII.GetString(bytes); 
string[] lines = oneBigString.Split('\n'); 
+0

本当にありません。パスカル文字列は最大255の8ビット文字でした。 C#の文字列はUNICODEで最大65535文字です。 –

+0

@RayFischerはい、そうです。私はパスカルとまったく同じ文字列型を意味しませんでした。私はペサントのために推測するPASCALスタイルの弦を言いました。私はちょうど彼らが長さの前に置かれ、ヌル終了していないことを意味しました。 – itsme86

1

あなたは単に使用できます。

string text = System.IO.File.ReadAllText("PathToFile"); 

それとも

string[] lines = System.IO.File.ReadAllLines("PathToFile"); 

そうでない場合は、単にバイトから文字列を作成し、文字列を分割:

bytes[] = ReadFile(); 
string allData = System.Text.Encoding.<Encoding>.GetString(result); 
string[] lines = allData.Split('\n'); 
0

try

System.Text.Encoding.Default.GetString(bytes); 

しかし、あなたはバイト配列としてファイルを読み込み、その後、C#で文字列配列に変換する必要はありません。代わりに、それぞれReadAllText(path)またはReadAllLines(path)を使用してstring/string配列として直接読み取ることができます。

string allText = File.ReadAllText("file path"); 
string[] allLines = File.ReadAllLines("file path"); 
0

C#の文字列について知っておくことが重要(本当に重要)なものがあります:彼らは、Unicode文字の不変シーケンスである、それはあなたがそれらについて言うことができる唯一の真にあるものです。そのため、どの文字がどれくらい大きいかを前提にすることはできず、文字列内の任意の文字のバイトオフセットについて仮定することはできません。

まあ、仮定することはできますし、ほとんどの場合はうまくいくでしょうが、うまくいかない場合は、デバッグするのが大変な作業になります。

Unicode文字には、8,16、または32ビットが必要です。 C#は文字列のUTF-16エンコーディングを使用します。つまり、文字列の文字は最低16ビットです。 32ビット文字はUnicode仕様の一部です(例:Emojisは32ビット空間に存在する傾向があります(0x1F44Cのように):C#では結果の文字列がメモリにどのように配置されるかについての約束はしていません。

関連する問題