拆分然后合并 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
的两个完全相同的副本 - 可能应该重构这个逻辑。
所以我想做的是将一个字节 [] 保存到我的数据库中。如果要发送到数据库的字节太长,我想将它分成两个大小一半的字节。但是我做错了什么,因为当我检查拆分字节组合是否等于原始字节时,不是。
我的代码如下所示:
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
的两个完全相同的副本 - 可能应该重构这个逻辑。