0

編集したデータを元のファイルに保存する際に問題が発生しています...文字列を textBox1 から読み込み元のファイルに保存したいと考えています。

ここに私の「ロード」機能があります:

public static string getItemName(int index)
{
    FileStream str = File.OpenRead(Directory.GetCurrentDirectory() + ybi);
    BinaryReader breader = new BinaryReader(str);
    breader.BaseStream.Position = itemSectionStart;
    byte[] itemSection = breader.ReadBytes(itemSectionEnd);

    string itemName = BitConverter.ToString(itemSection, 808 * index + 7, 64).Replace("00", "").Replace("-", "");
    return hex2ascii(itemName);

}

ここに私の「保存」機能があります:

public static bool setItemName(int index, string _FileName, byte[] _ByteArray)
{
    try
    {
        System.IO.FileStream _FileStream = new System.IO.FileStream(_FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write);
        _FileStream.Write(_ByteArray, 808 * index + 7, _ByteArray.Length);
        _FileStream.Close();
        return true;
    }
    catch (Exception _Exception)
    {
        MessageBox.Show(Convert.ToString(_Exception.Message));
    }
    return false;
}

ここで、HEX 文字列から ByteArray への変換において、ここに問題があると思います...

private byte[] HexStringToByteArray(string hexString)
{
    int hexStringLength = hexString.Length;
    byte[] b = new byte[hexStringLength / 2];
    for (int i = 0; i < hexStringLength; i += 2)
    {
        int topChar = (hexString[i] > 0x40 ? hexString[i] - 0x37 : hexString[i] - 0x30) << 4;
        int bottomChar = hexString[i + 1] > 0x40 ? hexString[i + 1] - 0x37 : hexString[i + 1] - 0x30;
        b[i / 2] = Convert.ToByte(topChar + bottomChar);
    }
    return b;
}
private void button2_Click(object sender, EventArgs e)
{
    int index = listBox1.SelectedIndex;
    string hex = "";
    foreach (char c in textBox1.Text)
    {
        int tmp = c;
        hex += String.Format("{0:x2}", (uint)System.Convert.ToUInt32(tmp.ToString()));
    }
    writeValuePositions.setItemName(index, save_FileName, HexStringToByteArray(hex.ToUpper()));
}

writeValuePositions.setItemName に送信される byteArray は正しくないと思います...この例外が発生します

---------------------------

---------------------------
Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.
---------------------------
OK   
---------------------------
4

2 に答える 2

0

setItemName の行に問題がある可能性があります。

_FileStream.Write(_ByteArray, 808 * index + 7, _ByteArray.Length);

2 番目のパラメーターは開始オフセットで、3 番目のパラメーターは書き込まれる文字の総数です。808 * index + 7 バイトが配列の末尾を通過したと書いているようです。配列の最後まで書き出す場合は、カウントからオフセットを引きます。

于 2012-04-30T20:21:27.057 に答える
0

これを試してください:

private void button2_Click(object sender, EventArgs e)
{
    writeValuePositions.setItemName(index, save_FileName, HexStringToByteArray(textBox1.Text);
}

private byte[] HexStringToByteArray(string hexString)
{
   if (String.IsNullOrEmpty(hexString) || hexString.Length % 2 != 0)
   {
      throw new ArgumentException("Invalid parameter.");
   }

   byte[] array = new byte[hexString.Length / 2];

   for (int i = 0; i < hexString.Length / 2; i++)
   {
      array[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
   }
   return array;
}

ただし、John Saunders がコメントで提案したことを覚えておいてください。

于 2012-04-30T20:27:20.787 に答える