拆分然后合并 byte[]

Split and then combine byte[]

所以我想做的是将一个字节 [] 保存到我的数据库中。如果要发送到数据库的字节太长,我想将它分成两个大小一半的字节。但是我做错了什么,因为当我检查拆分字节组合是否等于原始字节时,不是。

我的代码如下所示:

    public File Add(File item)
    {
        try
        {
            if (item == null)
            {
                throw new ArgumentNullException("item");
            }

            db.Entry(item).State = EntityState.Added;
            db.SaveChanges();
        }
        catch
        {
            File firstHalf = item;
            File lastHalf = item;
            firstHalf.@byte = item.@byte.Take(item.@byte.Length / 2).ToArray();
            lastHalf.@byte = item.@byte.Skip(item.@byte.Length / 2).ToArray();

            byte[] rv = new byte[firstHalf.@byte.Length + firstHalf.@byte.Length];
            System.Buffer.BlockCopy(firstHalf.@byte, 0, rv, 0, firstHalf.@byte.Length);
            System.Buffer.BlockCopy(lastHalf.@byte, 0, rv, firstHalf.@byte.Length, lastHalf.@byte.Length);

            if(rv == item.@byte)
            {
                Add(firstHalf);
                Add(lastHalf);
            }
        }

        return item;
    }


编辑

public partial class File
{
    public int C_id { get; set; }
    public string name { get; set; }
    public byte[] @byte { get; set; }
    public int file_id { get; set; }
    public int fk_folder { get; set; }
    public int fk_profile { get; set; }
}

要比较使用 rv.SequenceEqual(item.@byte)(或一个循环),您当前查看它们是否是相等的引用(它们不是)。

也不要使用异常来控制流程!

问题从这里开始:

File firstHalf = item;
File lastHalf = item;
firstHalf.@byte = item.@byte.Take(item.@byte.Length / 2).ToArray();

您刚刚在第一行中创建了对 item 的新引用,因此在第三行中您破坏了 原始 @byte

您需要使用 item 的深层复制。

一种可能的方法 - 在 File class 中创建 Clone 方法,这将是 return 具有复制字段的 File 的新实例,而不是File firstHalf = item; 将是 File firstHalf = item.Clone();

这是我想到的第一个方法,可能不是最好的方法。事实上,我现在无法估计 - 你真的需要你的 item 的两个完全相同的副本 - 可能应该重构这个逻辑。