Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何删除字节数组的第一个字符并将其保存到文件中_C#_Winforms - Fatal编程技术网

C# 如何删除字节数组的第一个字符并将其保存到文件中

C# 如何删除字节数组的第一个字符并将其保存到文件中,c#,winforms,C#,Winforms,我正在开发一个可以隐藏图像的简单表单应用程序。基本上,程序应该获取图像,将其转换为字节数组,在字节数组的前面添加一个字符,并输出扩展名为.jpg的图像。这会使图像看起来已损坏 我完成了前半部分,程序正在输出带有添加字符的图像。我只需要帮我删除这个角色 因此,与前半部分一样,您应该能够打开一个文件对话框,选择“隐藏”图像,并删除使其看起来已损坏的第一个字节 我希望打开隐藏的文件,将其转换为字节数组,删除该字节数组的第一个字符,并将其作为文件输出 namespace ArrayEditor {

我正在开发一个可以隐藏图像的简单表单应用程序。基本上,程序应该获取图像,将其转换为字节数组,在字节数组的前面添加一个字符,并输出扩展名为.jpg的图像。这会使图像看起来已损坏

我完成了前半部分,程序正在输出带有添加字符的图像。我只需要帮我删除这个角色

因此,与前半部分一样,您应该能够打开一个文件对话框,选择“隐藏”图像,并删除使其看起来已损坏的第一个字节

我希望打开隐藏的文件,将其转换为字节数组,删除该字节数组的第一个字符,并将其作为文件输出

namespace ArrayEditor
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                byte[] bytes = File.ReadAllBytes(ofd.FileName);
                string[] TBBites = textBox2.Text.Split(',');

                int i = 0;
                foreach (byte bite in bytes)
                {
                    if (i == Convert.ToInt32(textBox1.Text))
                    {
                        for (int x = 0; x < TBBites.Count(); x++)
                        {
                            bytes[i + x] = Convert.ToByte(Convert.ToInt32(TBBites[x]));
                        }
                        break;
                    }

                    i++;
                }

                File.WriteAllBytes("F://V2 Dog (Encrypted).jpg", bytes);
            }


        }
                    //textBox3
        private void TextBox1_TextChanged(object sender, EventArgs e)
        {

        }

                    //textBox4
        private void TextBox2_TextChanged(object sender, EventArgs e)
        {

        }

        private void Button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                byte[] bytes = File.ReadAllBytes(ofd.FileName);



                File.WriteAllBytes("F://V2 Dog.jpg", bytes);
            }
        }
    }
名称空间数组编辑器
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
OpenFileDialog ofd=新建OpenFileDialog();
if(ofd.ShowDialog()==DialogResult.OK)
{
byte[]bytes=File.ReadAllBytes(ofd.FileName);
string[]TBBites=textBox2.Text.Split(',');
int i=0;
foreach(字节中的字节位)
{
if(i==Convert.ToInt32(textBox1.Text))
{
对于(int x=0;x
预期成果:

隐藏: 1.用户使用第一个按钮打开图像。 2.程序输出到文件,在字节[]前面添加一个字节,扩展名为.jpg

解除隐藏: 1.用户通过文件对话框打开隐藏的文件。
2.程序输出文件时,在字节[]前面没有添加字节和.jpg扩展名。

不知道为什么要逐字节读取文件,因为您没有在字节级执行任何操作。您正在执行文件级操作。您只想在数据中预加一个字节,然后删除(取消预加)该字节

类似这样的方法应该会奏效:
隐藏(“预先结束”):

透露(“预先准备”、“隐藏”):


免责声明:代码未经测试。

现代方法是使用Span和Slice方法,但这取决于所针对的.net版本

var bytes = File.ReadAllBytes(originalFilePath);
var span = bytes.AsSpan();
var slice = span.Slice(1);
var result = slice.ToArray();
如果span在目标版本中不可用,则可以使用诸如块复制或其他性能更友好的答案之一

var bytes = File.ReadAllBytes(originalFilePath);
var result = new byte[bytes.Length-1];
Buffer.BlockCopy(bytes, 1, result, 0, bytes.Length-1);

这行得通吗?
File.writealBytes(“F://V2 Dog.jpg”,bytes.Skip(1));
您最好使用BlockCopy。下面是一个很好的示例代码摘要。@ConradFrix它不应该;
文件。writealBytes
需要
字节[]
作为arg,而不是
IEnumerable
。您必须添加
.ToArray()
,在Linq中,这些操作中涉及的泛型使操作比简单的手动数组拷贝慢得多。“AsSpan”出现错误/:您的目标是.net的哪个版本?
var bytes = File.ReadAllBytes(originalFilePath);
var span = bytes.AsSpan();
var slice = span.Slice(1);
var result = slice.ToArray();
var bytes = File.ReadAllBytes(originalFilePath);
var result = new byte[bytes.Length-1];
Buffer.BlockCopy(bytes, 1, result, 0, bytes.Length-1);