2017-01-06 1 views
1

タイトルが示すように、「未処理の例外は、 'System.FormatException'」というスタイルのメッセージです。理由を理解する助けが必要です。私は解析する必要がある16進数の値を持つファイルを読み込んでいます。私が読んでいる値は、このような "0x12345678"(4バイトの長さ)のように見える可能性があります。バイトに変換する未処理の例外

最初のバイト(リトルエンディアンであることに注意してください)は「BE」で、問題は発生しません。私の問題は、次の3バイトを取り込み、それを人間が読めるintに変換しようとしています。 (長い話を、私はパースだ出力を生成するプログラムは、人間が読める進数をとり、このLEナンセンスに変換します。)

string parmVal = lineF.Substring((pos + length)); // this is "0x12345678" 

    string hexID = parmVal.Substring(2, 2); // stores '12' 

    byte[] testID = new byte[4]; 
    testID[0] = Convert.ToByte(parmVal.Substring(4, 2)); <----error here 
    testID[1] = Convert.ToByte(parmVal.Substring(6, 2)); 
    testID[2] = Convert.ToByte(parmVal.Substring(8, 2)); 
    testID[3] = Convert.ToByte(0); 

    decimalID = int.Parse(hexID, System.Globalization.NumberStyles.HexNumber); // stores 18 (0x12) 
    testIDNumber = BitConverter.ToInt32(testID,0); // stores 345678 

を興味深いことに、コードでI後の出力、これらの値をCSVへファイル、そして私が出力した値は、たとえその例外をスローしても正しいように見えます。私は最後の3バイトを最初の行と同じ方法で読み込もうとしましたが、次にint.Parse()を実行すると、そのエンディアンが後ろ向きになります。私はそれを変換する0x "785634"、その変換0x "345678"したいと思います。

+1

:あなたのケースでは

それがなければなりません。エラーはそこにはありません。 parmValの値が0x12345678であることは確かですか? – CodingYoshi

+0

コードは機能します。 'lineF.Substring((pos + length))'を '' 0x12345678 ''に置き換え、エラーなしで実行します。 –

+0

これは健全性チェックのために叫んでいます。 "0x12345678"が機能するので、それは部分文字列呼び出しによって返されるものであってはなりません。私は実験を行います:明示的に期待される条件(parmVal == "0x12345678")をチェックし、一致しなければスローします。私はあなたのスローが呼び出されると思う。 – DLCross

答えて

1

Convert.ToByte呼び出しでbaseを指定してみます。ことはできません

testID[0] = Convert.ToByte(parmVal.Substring(4, 2), 16);