2016-06-27 4 views
2

の外のByteArray:StringASCIIから知られていないcharが含まれている場合、それは私がUTF8にエンコーディングを変更しそのため63C#のUTF8エンコード私は次のような問題を持っている範囲

を使用していますが、私はcharを知っているlengthの2つbytes、私は範囲外のエラーを取得することができます。
問題を解決するにはどうすればよいですか?

System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); 

byte[] baInput = enc.GetBytes(strInput); 

// Split byte array (6 Byte) in date (days) and time (ms) parts 
byte[] baMsec = new byte[4]; 
byte[] baDays = new byte[2]; 

for (int i = 0; i < baInput.Length; i++) 
{ 
    if (4 > i) 
    { 
     baMsec[i] = baInput[i]; 
    } 
    else 
    { 
     baDays[i - 4] = baInput[i]; 
    } 
} 
+1

'strInput'の内容は何ですか? – Toxantron

+0

内容は次のとおりです。l|h * – xproseal

+0

テキストではなくバイトで作業しているようです。最初の場所に文字列を格納するのではなく、バイト配列を使用します。最初に 'strInput'をどうやって取得しますか? – CodeCaster

答えて

2

に値を設定することができ、あなたが持つことを思われる問題は、文字の数ではなくバイト数を知っているということですUTF8を使用している場合。ちょうどその問題を解決するには、使用できます。

byte[] baMsec = Encoding.UTF8.GetBytes(strInput.SubString(0, 4)); 
byte[] baDays = Encoding.UTF8.GetBytes(strInput.SubString(4)); 
+0

'strInput'に§║êまたはl|h * – xproseal

+0

@xprosealありがとうございました。私はサンプルデータを見たときに私の質問を編集しました。もともとそのデータを構築するために使用されたエンコーディングを調べ、そのエンコーディングを自分で使用することをお勧めします。 –

+0

私の答え*質問ではありません:P –

0

問題は、あなたのbaInputを含むことができ、両方のbaDaysbaMsec以上の値を含めることができるということです。 6回の反復の後、配列のサイズが足りなくなります。したがって、例外です。

7回目の反復をヒットすると= 2となるi - 4が得られます。

baDaysは2つのだけのアイテムを持っているので、あなたはインデックス0と1

+0

問題を説明しましたが、解決策を提示しませんでした。 – Toxantron

+0

それは本当に依存しています。最大6バイトまで読み込むことができますが、データを切り捨てます。おそらく、すべての文字を読むことができるように、OPは配列を拡張する必要があります。 UTF-8の場合、配列のサイズを2倍にすることになります。おそらく、データがタイムスタンプであるように見えるので、データをASCIIで強制することによって、これを起こさないようにするオプションがあります。 –

1

推奨される解決策:

1)SubString(Int32, Int32)メソッドを使用してstrInputを分割して別々のString変数に日付と時刻の部分を取得し、strDateを言うと、 strTime

2)次にstrDatestrTimeUTF8Encoding.GetBytesを呼び出して、それぞれbaDaysbaMsecにバイト配列を集めます。これが機能するのはなぜ

C#のStringは、非ASCII文字を表すために同様に良いですエンコードされたデフォルトUTF-16、です。したがって、データは失われません。

一般的注意:

直接バイトレベルでエンコードされた文字列を操作しようとすることはありません、あなたは迷子ます。バイトが必要な場合は、C#のStringおよびEncodingクラスメソッドを使用してバイトを取得します。

代替アプローチ:

あなたの日時データが数字以外の文字が含まれていますなぜ私は(他の人のように)思ったんだけど。私はあなたのデータがreader["TIMESTAMP2"].ToString();から得られ、サンプルの内容が§║ ê or l¦hであるというコメントを見ました。 に格納されている数値データを間違って解釈しているかどうかを確認してください。実際に数値タイプとして扱うべきでしょうか。それ以外の場合は、この方法を使用してもすぐに予期せぬ出力が得られます。

+0

[その答え](http://stackoverflow.com/a/38047841/993547)はすでに数分前に与えられていました。 –

+0

私は知っています。私が答えを作っている間に現れました。私は私を削除する必要がありますか? –

+0

それは可能です、はい。また、以前の回答では提供されなかった情報を提供するために、回答を延長することもできます。それはあなたの答えを際立たせます。 –

関連する問題