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