gpt4 book ai didi

c# - 字节数组末尾有大量 0 值

转载 作者:行者123 更新时间:2023-11-30 21:50:27 25 4
gpt4 key购买 nike

我正在使用 BitMiracle 的 LibTiff.Net 读取位图图像并返回一个 TIFF 字节 [],该字节 [] 作为 Base64String 嵌入到文件中。我注意到 Base64 字符串最终比我预期的要长很多,其尾端是大量的“A”字符。在调试时,我看到 LibTiff 返回给我的 byte[] 末尾有几千个 0 值,这些值似乎不是图像本身的必要部分(据我所知)。

我在这里使用 BitMiracle 的示例代码来转换:https://bitmiracle.github.io/libtiff.net/html/075f57db-d779-48f7-9fd7-4ca075a01599.htm

不过,我不太明白什么会导致 byte[] 末尾出现“垃圾”。有什么想法吗?

编辑以添加代码 - GetTiffImageBytes() 在上面的链接中:

public void GenImage()
using (System.Drawing.Image frontImage = System.Drawing.Image.FromStream(file))//;
{
file.Close();

//Draw something
b = new Bitmap(frontImage);
Graphics graphics = Graphics.FromImage(b);
graphics.DrawString(data1, (Font)GlobalDict.FontDict["font1"], Brushes.Black, 200, 490);
graphics.DrawString(data2, (Font)GlobalDict.FontDict["font2"], Brushes.Black, 680, 400);

}
//Convert to TIF - requires BitMiracle.LibTiff.Classic
byte[] tiffBytes = GetTiffImageBytes(b, false);

return tiffBytes;
}

上面的调用者:

  byte[] aFrontImage = MiscTools.GenImage(somestuff);

fileXML.WriteLine(" <FrontImage>" + System.Convert.ToBase64String(aFrontImage, 0, aFrontImage.Length) + "</FrontImage>");

所有的事情都说完了,它运行良好,我们的应用程序可以读取生成的图像。我只是想缩小尺寸,因为其中一些文件可能有数万张图片。我有一些较旧的示例文件,这些文件是通过另一种方法用一些 Base64 字符串手动创建的,这些字符串的大小大致相同,保存所有我认为是垃圾的尾部字节。

正如有人评论的那样,一种选择可能是只读取 byte[] 并在转换之前从末尾删除所有 0 值,但我试图弄清楚为什么会这样。

谢谢!

最佳答案

问题很可能是这个,在linked source example中找到:

return ms.GetBuffer();

对于 MemoryStream ,这将返回整个底层数组,即使您还没有实际使用该数组的所有内容。如果您写入足够多的内容来填充此缓冲区,该缓冲区将被调整为更大的缓冲区,但它不会扩展到仅覆盖所需的大小,它每次都会增长到以前大小的两倍。此外,您还有一个 Length 属性,该属性将指示该数组的实际使用量。

这类似于 List<T> 的容量,每次填满当前容量时,它的大小也会加倍。 Count属性将指示列表中实际有多少项。

修复很简单,将上面的代码行替换为:

return ms.ToArray();

这将创建一个新数组,其大小足以包含实际写入内存流的字节并将缓冲区的内容(适合和计数的部分)复制到其中。

要验证缓冲区是否大于所需,您可以运行以下简单代码:

var ms = new MemoryStream();
Console.WriteLine("GetBuffer: " + ms.GetBuffer().Length);
Console.WriteLine("ToArray: " + ms.ToArray().Length);
ms.WriteByte(0);
Console.WriteLine("GetBuffer: " + ms.GetBuffer().Length);
Console.WriteLine("ToArray: " + ms.ToArray().Length);

这将输出:

GetBuffer: 0
ToArray: 0
GetBuffer: 256
ToArray: 1

如您所见,仅写入 1 个字节时的初始缓冲区大小增加到 256 个字节。在此之后,每次达到当前大小时它都会加倍。

.NET Fiddle here .

关于c# - 字节数组末尾有大量 0 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36319597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com