Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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# 将tif文件转换为base64编码时发生OutOfMemory异常_C#_Out Of Memory_Tobase64string_Large File Upload - Fatal编程技术网

C# 将tif文件转换为base64编码时发生OutOfMemory异常

C# 将tif文件转换为base64编码时发生OutOfMemory异常,c#,out-of-memory,tobase64string,large-file-upload,C#,Out Of Memory,Tobase64string,Large File Upload,我们已经在C#中创建了控制台应用程序,其中将读取多页tif/tiff文件,逐页拆分,然后转换为base64编码以在其他目标应用程序中上载文件(因为这只接受base64编码以上载文档)每当抛出类型为“System.OutOfMemoryException”的文件大小超过500 MB时,就会出现内存不足异常 Exception at System.Convert.ToBase64String(Byte[] inArray, Int32 offset, Int32 length, Base64Form

我们已经在C#中创建了控制台应用程序,其中将读取多页tif/tiff文件,逐页拆分,然后转换为base64编码以在其他目标应用程序中上载文件(因为这只接受base64编码以上载文档)每当抛出类型为“System.OutOfMemoryException”的文件大小超过500 MB时,就会出现内存不足异常

Exception at System.Convert.ToBase64String(Byte[] inArray, Int32 offset, Int32 length, Base64FormattingOptions options)
   at System.Convert.ToBase64String(Byte[] inArray)
代码段:

Byte[] bytes = File.ReadAllBytes(filepath);
String base64stringofdocument = Convert.ToBase64String(bytes);

上面的filepath指的是>文件的绝对路径

使用字符串会带来开销。对于非常大的数据量,最好使用数组或流。在这种情况下,您可以首先重写代码以使用
Convert.ToBase64CharArray
。因此,您的代码将更改为以下内容:

Byte[] bytes = File.ReadAllBytes(filePath);
// Compute the number of Base64 converted characters required (must be divisible by 4)
long charsRequired = (long)((4.0d/3.0d) * bytes.Length);
if (charsRequired % 4 != 0) {
    charsRequired += 4 - charsRequired % 4;
}
// Allocate buffer for characters, and write converted data into the array
Char[] chars = new Char[charsRequired];
Convert.ToBase64CharArray(bytes, 0, bytes.Length, chars, 0);

然后,您可以将
chars
数组上载到目标应用程序。

您可能需要做一些工作才能找到这一问题的根本原因。在.NET中,单个字符串对象的长度不能超过2^31-1个字符。Base64编码相对于输入大小至少占用4/3的空间。这使您的理论文件大小上限约为805MB,但实际上可能更低。您可能希望在转换为Base64之前压缩输入。您是否考虑过将数据流化而不是将整个文件读入内存?项目>属性>构建选项卡,取消选中“首选32位”复选框。您不喜欢它。@Charleh只需参考上面的代码片段,在传递到base64编码之前,将文件转换为字节数组。如何改进这一点?请帮助usHi Jack,尝试使用上述建议,但如果再次将字符数组转换为字符串对象,则可能会出现相同的问题,因为目标应用程序仅在上载文档时接受字符串对象。有没有更好的方法来处理大文件。请共享代码片段。@Sheik您的目标应用程序似乎不太可能只接受.NET字符串。如果您编辑您的帖子以包含用于上载到目标应用程序的代码,则可能需要进一步评论。在上述代码行之后,我们将只将编码的base64字符串传递到目标应用程序的Webservice调用中。这一步之后没什么。