gpt4 book ai didi

c# - 看不到 NULL 终结符

转载 作者:太空狗 更新时间:2023-10-30 01:04:15 30 4
gpt4 key购买 nike

我已经为此苦苦挣扎了一段时间。我创建了一个允许您打开 .TXT 文件的实用程序。这些文本文件包含 PCL(打印命令语言)。当我导入一个新文件时,它被\0(NULL 终止符)截断了。因为 PCL 文件随机包含图形图像,所以我导入的所有内容都在第一个位图图像处被截断,因为位图图像以 NULL 开头。

这正是此处所见的问题:Displaying Raw Data From Image File Using TextBox or RichTextBox?

不幸的是,由于我的(新手)声誉低下(需要 15 个代表),我无法对此线程发表评论。也无法粘贴屏幕截图(需要 10 次重复)。


Notepad++ 显示信息的方式如下:

enter image description here


以下是我的 RichTextBox 显示相同信息的方式:

enter image description here


这是一个问题的原因(缩小):

enter image description here

栅格数据正好位于我需要的两部分数据(PCL)之间。栅格数据下方的所有信息都不会拉入。


这是我尝试过的方法(注意:我使用的是自定义 RichTextBox,但这应该不会有任何影响,因为它只是一个具有拖放功能的 RichTextBox):

byte[] bytes = new byte[2048];
string data = System.Text.Encoding.ASCII.GetString(bytes);
dragDropRichTextBox1.Text = data.Replace("\0", @"1");

这只会导致 2048 个数字“1”字符的链,而没有文本文件的数据被拉入。非常感谢任何帮助。

无论我做什么,我都想保留我当前的拖放功能:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PCL_Utility
{
public class DragDropRichTextBox : RichTextBox
{
public DragDropRichTextBox()
{
this.AllowDrop = true;
this.DragDrop += DragDropRichTextBox_DragDrop;
}

void DragDropRichTextBox_DragDrop(object sender, DragEventArgs e)
{
//string[] fileText = e.Data.GetData(DataFormats.FileDrop) as string[];
string[] fileText = e.Data.GetData(DataFormats.FileDrop) as string[];

if (fileText != null)
{
foreach (string name in fileText)
{
try
{
this.AppendText(File.ReadAllText(name) + "\n -------- End of File -------- \n\n");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
}
}

最佳答案

首先,您不需要 ASCII 编码。 ASCII 是一种 7 位编码。任何读取到的设置了高位的字符(即字符代码 128 到 255)都会被解码器转换为问号。因此,以 ASCII 格式读取二进制数据会破坏您的数据。

其次,富文本框在后台使用 Windows 控件,该控件设计用于处理以 null 结尾的字符串。所以它会在第一次看到 '\0' 字符时截断文本。如果要在编辑控件中显示二进制数据,则需要修改要显示的文本。

您的“文本”文件实际上不是文本,因为它们包含二进制(即非人类可读)数据。最好的办法是打开文件并将整个文件以二进制形式读入内存缓冲区。即:

byte[] fileBytes = File.ReadAllBytes("filename");

然后,如果要在文本控件中显示数据,则必须创建一个表示数据的字符串。我会建议这样的事情:

StringBuilder sb = new StringBuilder();
foreach (var b in fileBytes)
{
// handle printable characters
if (b >= 32 || b == 10 || b == 13 || b = 9) // lf, cr, tab
sb.Append((char)b);
else
{
// handle control characters
switch (b)
{
case 0 : sb.Append("(nul)"); break;
case 27 : sb.Append("(esc)"); break;
// etc.
}
}
}

与其构建一个大的 switch 语句,不如构建一个查找表,其中包含要转换的每个值的字符串。字典可能是最好的。像这样的东西:

private Dictionary<byte, string> Conversions = new Dictionary<byte, string>()
{
{0, "(nul)"},
{27, "(esc)"},
// etc.
};

然后你的循环可以这样做:

foreach (var b in fileBytes)
{
string s;
if (Conversions.TryGetValue(b, out s))
{
sb.Append(s);
}
else
{
sb.Append((char)b);
}
}

关于c# - 看不到 NULL 终结符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24268672/

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