C# 二进制文件可以作为文本读取吗?
虽然问题标题本身是完整的,但我将提供一些关于如何解决这个问题的元信息C# 二进制文件可以作为文本读取吗?,c#,varchar,binary-data,C#,Varchar,Binary Data,虽然问题标题本身是完整的,但我将提供一些关于如何解决这个问题的元信息 对于SQL Server和MySQL,任何类型和大小的数据都很好,但最近我开始使用一个DBMS,该DBMS在表的每列中最多只允许64 KB的数据。当列中有二进制数据时,64 KB的限制是有问题的。其他示例包括:包含图像、音频、多媒体对象或地理空间数据的列 您不会总是得到大小小于64 KB的图像。blob不能简单地存储在这样的DBMS中。DBMS允许用户通过在C/C++中编写函数并调用它们来增加其功能。但即使使用这些函数,每次
对于SQL Server和MySQL,任何类型和大小的数据都很好,但最近我开始使用一个DBMS,该DBMS在表的每列中最多只允许64 KB的数据。当列中有二进制数据时,64 KB的限制是有问题的。其他示例包括:包含图像、音频、多媒体对象或地理空间数据的列 您不会总是得到大小小于64 KB的图像。blob不能简单地存储在这样的DBMS中。DBMS允许用户通过在C/C++中编写函数并调用它们来增加其功能。但即使使用这些函数,每次调用最多也可以返回64 KB的数据 有人建议我解决问题- 将二进制数据存储在文件系统上,并为其存储一个标识符 表列中的特定二进制数据。这样,当有人 请求该数据时,数据可以分块发送回调用方 每个大小为64 KB 但是第二个限制出现了,即数据只能作为以下数据类型之一从DBMS发送-char/varchar/integer/smallint/bigint/boolean/real。这个列表中最受欢迎的候选人是varchar(max),原因很明显(它是最长的)
因此,二进制文件可以作为文本读取和发送吗?与DBMS对话的客户端正在用C#开发。将二进制文件块作为文本读取,然后发送文本,只有一个问题。问题是转换后的文本不会返回创建此文本的二进制文件 在一个足够低的抽象层次上,如果不这样理解,就足够简单了,所有文件都是“二进制”的,因为它们只包含一组以二进制形式编码的数字 但是,区分以下内容是非常重要的
- 文本文件,其中所有数字都可以解释为代表人类可读文本的字符,以及
- 二进制文件,其中包含的数据如果被解释为字符,将产生不可打印的字符。1
可供替代的 最常见的替代方法是将二进制数据转换为其十六进制表示形式,然后发回与二进制数据等价的字符串。现在,一个字节的大小显然是1字节。1个字符的大小也是1个字节,但需要2个字符才能以十六进制形式表示1个字节。换句话说,当您想要检索1GB的二进制文件时,您将获得2GB的文本 但是,采用这种方法时,支持将十六进制字符串到二进制的转换减少到一个方法调用,如中所示 -------- 未证明更好,但另一种方法如下:
- 创建一个字符串流(或类似于
字符串生成器的字符串流)
- 选择任意字符(需要1个字节)作为分隔符
- 选择DBMS支持的最大可能的基元数值。让它的大小为k字节。在我的DBMS中,它是
,它是一个64位(8字节)的固定大小的整数BIGINT
- 一次读取二进制文件k字节,并创建等效的数值
- 将数值插入字符串流,以字符分隔
- 当流/生成器的大小达到可能的最大值时,返回此字符串
1在ASCII码中,前32个字符是非打印控制字符,最初用于控制电传打字机的行为,使其执行诸如鸣钟、备份一个字符、移动到新行以及将托架移动到行首等操作。在这32个控制字符中,只有换行符、回车符和水平制表符这三个字符通常出现在文本文件中。将二进制文件块读取为文本,然后发送该文本,只有一个问题。问题是转换后的文本不会返回创建此文本的二进制文件 在一个足够低的抽象层次上,如果不这样理解,就足够简单了,所有文件都是“二进制”的,因为它们只包含一组以二进制形式编码的数字 但是,区分以下内容是非常重要的
- 文本文件,其中所有数字都可以解释为代表人类可读文本的字符,以及
- 二进制文件,其中包含的数据如果被解释为字符,将产生不可打印的字符。1
可供替代的 mo