0

BinaryWriter を使用して、テキスト ボックスにある 10 進数を 16 進数に変換し、次にバイト配列に変換し、この配列を必要なオフセットに書き込む方法を知りたいです。

私の textBox11 の 10 進数値は「101200001」であり、「06 08 30 81」である 16 進数値を特定のオフセットでファイルに書き込む必要があります。

これは私が持っているものですが、textBox11.Text から byteArray への変換がありません。

    int index = listBox1.SelectedIndex;
    int startOffset = 0x00000008;
    int itemIDDiff = 0x00000328;

    BinaryWriter bw = new BinaryWriter(File.Open(_FileName, FileMode.Open));
    bw.BaseStream.Seek(startOffset + itemIDDiff * index, SeekOrigin.Begin);
    bw.Write( /* textBox11.Text converted to HEX then to byte array? */ );
    bw.Close();

これは、書き込む必要があるファイルの一部です。

00000330h: 02 00 00 00 00 00 00 00 4A 61 64 65 20 45 61 72 ; ........Jade Ear
00000340h: 72 69 6E 67 00 00 00 00 00 00 00 00 00 00 00 00 ; ring............

「02 00 00 00」を「06 08 30 81」に変更したいとしましょう。BinaryWriter を使用してこれを行うにはどうすればよいですか?

4

3 に答える 3

3

10 進数を 16 進数に変換することはできません (小数部分をどのように処理しますか?)。ただし、代わりにInt64(a )を使用できます。long

var text = "101200001";
var asLong = Convert.ToInt64(text);
var asHex = asDecimal.ToString("X");

asHexこれで、目的の 16 進文字列が得られました。

しかし、あなたが抱えている問題は、「hex」が実際にはディスク上の生のバイトのセットを表示する方法にすぎないということです。また、数値を生のバイトで表現する方法は、プログラム自体によって異なります。バイナリ ライターを使用している場合は、書き込もうとしている数値のバイト表現を知っていれば十分です。これだけで十分かもしれません (文字列に変換しなくても):

bw.Write(asLong);

これをさらに見てみると、4 バイトの数値を求めているように見えるので、int は long ではありません。BitConverter良いですが、必要な順序とは逆の順序ですべてを書き込みます。したがって、これらを念頭に置いて、以下を確認してください。

var text = "101200001";
var asInt = Convert.ToInt32(text);                    // 4 byte number
var asBytes = BitConverter.GetBytes(asInt).Reverse(); // same hex representation as a byte array (same order)

したがって、あなたの例ではこれを追加します:

bw.Write(asBytes);
于 2012-05-01T23:06:35.820 に答える
3

リトル エンディアンとビッグ エンディアンのどちらが必要かは不明です。リトル エンディアンは単純です。

bw.Write(int.Parse(textBox11.Text));

質問で示唆されているビッグ エンディアンの場合、通常とは異なり、バイト オーダーを逆にする必要があります。

var bytes = BitConverter.GetBytes(int.Parse(textBox11.Text));
Array.Reverse(bytes);
bw.Write(bytes);
于 2012-05-01T23:19:23.297 に答える
2

数値を 16 進数表現に変換して解析することはできますが、それはまったく無意味です。

メソッドを使用しInt32.Parseて文字列を数値に解析し、次にBitConverter.GetBytesメソッドを使用して数値をバイト配列として取得します。

byte[] data = BitConverter.GetBytes(Int32.Parse(textBox11.Text));

次に、バイトをストリームに書き込みます。

bw.Write(data, 0, data.Length);

81, 30, 08 06これは、Intel (または互換性のある) CPU ベースのコンピュータなど、リトル エンディアン番号表現を使用するシステムのストリームにバイトを書き込むことに注意してください。ファイルにビッグ エンディアン表現が必要な場合は、書き込む前に配列を逆にする必要があります。

Array.Reverse(data);
于 2012-05-01T23:10:51.693 に答える