Byte[] 拆分成 1022 长度段然后恢复不匹配
Byte[] Split Up Into 1022 Length Sections Then Restored Not Matching Up
我正在尝试获取 PDF 文档并通过 MVC 网站上传以存储到 SAP 结构中。 SAP 结构要求将字节数组分成 1022 个长度部分。在我尝试从 SAP 查看 PDF 文档之前,该程序似乎运行良好。不幸的是,由于访问权限,我无法查看存储在 SAP 中的 PDF 数据。因此,我创建了一种 MOCK 程序来匹配发送到 SAP (fileContent) 之前的字节数组,然后匹配从 SAP (fileContentPostSAP) 返回后的字节数组。
程序比较字节数组并在数组位置 1022 处找到不匹配的值。
我的程序中是否存在导致字节数组不匹配的错误?它们应该完全匹配,对吧?
ClaimsIdentityMgr claimIdentityMgr = new ClaimsIdentityMgr();
ClaimsIdentity currentClaimsIdentity = claimIdentityMgr.GetCurrentClaimsIdentity();
var subPath = "~/App_Data/" + currentClaimsIdentity.EmailAddress;
var destinationPath = Path.Combine(Server.MapPath(subPath), "LG WM3455H Spec Sheet.pdf");
byte[] fileContent = System.IO.File.ReadAllBytes(destinationPath);
//pretend this is going to SAP
var arrList = SAPServiceRequestRepository.CreateByteListForStructure(fileContent);
var mockStructureList = new List<byte[]>();
foreach (byte[] b in arrList)
mockStructureList.Add(b);
//now get it back from Mock SAP
var fileContentPostSAP = new byte[fileContent.Count()];
var rowCounter = 0;
var prevLength = 0;
foreach (var item in mockStructureList)
{
if (rowCounter == 0)
System.Buffer.BlockCopy(item, 0, fileContentPostSAP, 0, item.Length);
else
System.Buffer.BlockCopy(item, 0, fileContentPostSAP, prevLength, item.Length);
rowCounter++;
prevLength = item.Length;
}
//compare the orginal array with the new one
var areEqual = (fileContent == fileContentPostSAP);
for (var i = 0; i < fileContent.Length; i++)
{
if (fileContent[i] != fileContentPostSAP[i])
throw new Exception("i = " + i + " | fileContent[i] = " + fileContent[i] + " | fileContentPostSAP[i] = " + fileContentPostSAP[i]);
}
这里是 CreateByteListForStructure 函数:
public static List<byte[]> CreateByteListForStructure(byte[] fileContent)
{
var returnList = new List<byte[]>();
for (var i = 0; i < fileContent.Length; i += 1022)
{
if (fileContent.Length - i >= 1022)
{
var localByteArray = new byte[1022];
System.Buffer.BlockCopy(fileContent, i, localByteArray, 0, 1022);
returnList.Add(localByteArray);
}
else
{
var localByteArray = new byte[fileContent.Length - i];
System.Buffer.BlockCopy(fileContent, i, localByteArray, 0, fileContent.Length - i);
returnList.Add(localByteArray);
}
}
return returnList;
}
代码中似乎有一个简单的错误。
这个循环,从块中重建数组的内容:
var prevLength = 0;
foreach (var item in mockStructureList)
{
if (rowCounter == 0)
System.Buffer.BlockCopy(item, 0, fileContentPostSAP, 0, item.Length);
else
System.Buffer.BlockCopy(item, 0, fileContentPostSAP, prevLength, item.Length);
rowCounter++;
prevLength = item.Length;
}
根据blocks的描述,每个block是1022字节,也就是说第一次迭代后prevLength
设置为1022,下一次迭代后设置为1022再次.
更正确的 prevLength
赋值应该是这样的:
prevLength += item.Length;
^
|
+-- added this
这将正确地将输出数组中的指针一次向前移动一个块,而不是将其移动到第二个块然后将其留在那里。
基本上,您将块 0 写在正确的位置,但所有其他块都写在块 1 的顶部,将输出数组中的块 2 及以后的块留为零。
我正在尝试获取 PDF 文档并通过 MVC 网站上传以存储到 SAP 结构中。 SAP 结构要求将字节数组分成 1022 个长度部分。在我尝试从 SAP 查看 PDF 文档之前,该程序似乎运行良好。不幸的是,由于访问权限,我无法查看存储在 SAP 中的 PDF 数据。因此,我创建了一种 MOCK 程序来匹配发送到 SAP (fileContent) 之前的字节数组,然后匹配从 SAP (fileContentPostSAP) 返回后的字节数组。
程序比较字节数组并在数组位置 1022 处找到不匹配的值。
我的程序中是否存在导致字节数组不匹配的错误?它们应该完全匹配,对吧?
ClaimsIdentityMgr claimIdentityMgr = new ClaimsIdentityMgr();
ClaimsIdentity currentClaimsIdentity = claimIdentityMgr.GetCurrentClaimsIdentity();
var subPath = "~/App_Data/" + currentClaimsIdentity.EmailAddress;
var destinationPath = Path.Combine(Server.MapPath(subPath), "LG WM3455H Spec Sheet.pdf");
byte[] fileContent = System.IO.File.ReadAllBytes(destinationPath);
//pretend this is going to SAP
var arrList = SAPServiceRequestRepository.CreateByteListForStructure(fileContent);
var mockStructureList = new List<byte[]>();
foreach (byte[] b in arrList)
mockStructureList.Add(b);
//now get it back from Mock SAP
var fileContentPostSAP = new byte[fileContent.Count()];
var rowCounter = 0;
var prevLength = 0;
foreach (var item in mockStructureList)
{
if (rowCounter == 0)
System.Buffer.BlockCopy(item, 0, fileContentPostSAP, 0, item.Length);
else
System.Buffer.BlockCopy(item, 0, fileContentPostSAP, prevLength, item.Length);
rowCounter++;
prevLength = item.Length;
}
//compare the orginal array with the new one
var areEqual = (fileContent == fileContentPostSAP);
for (var i = 0; i < fileContent.Length; i++)
{
if (fileContent[i] != fileContentPostSAP[i])
throw new Exception("i = " + i + " | fileContent[i] = " + fileContent[i] + " | fileContentPostSAP[i] = " + fileContentPostSAP[i]);
}
这里是 CreateByteListForStructure 函数:
public static List<byte[]> CreateByteListForStructure(byte[] fileContent)
{
var returnList = new List<byte[]>();
for (var i = 0; i < fileContent.Length; i += 1022)
{
if (fileContent.Length - i >= 1022)
{
var localByteArray = new byte[1022];
System.Buffer.BlockCopy(fileContent, i, localByteArray, 0, 1022);
returnList.Add(localByteArray);
}
else
{
var localByteArray = new byte[fileContent.Length - i];
System.Buffer.BlockCopy(fileContent, i, localByteArray, 0, fileContent.Length - i);
returnList.Add(localByteArray);
}
}
return returnList;
}
代码中似乎有一个简单的错误。
这个循环,从块中重建数组的内容:
var prevLength = 0;
foreach (var item in mockStructureList)
{
if (rowCounter == 0)
System.Buffer.BlockCopy(item, 0, fileContentPostSAP, 0, item.Length);
else
System.Buffer.BlockCopy(item, 0, fileContentPostSAP, prevLength, item.Length);
rowCounter++;
prevLength = item.Length;
}
根据blocks的描述,每个block是1022字节,也就是说第一次迭代后prevLength
设置为1022,下一次迭代后设置为1022再次.
更正确的 prevLength
赋值应该是这样的:
prevLength += item.Length;
^
|
+-- added this
这将正确地将输出数组中的指针一次向前移动一个块,而不是将其移动到第二个块然后将其留在那里。
基本上,您将块 0 写在正确的位置,但所有其他块都写在块 1 的顶部,将输出数组中的块 2 及以后的块留为零。