Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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# 二进制文件可以作为文本读取吗?_C#_Varchar_Binary Data - Fatal编程技术网

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中,它是
    BIGINT
    ,它是一个64位(8字节)的固定大小的整数
  • 一次读取二进制文件k字节,并创建等效的数值
  • 将数值插入字符串流,以字符分隔
  • 当流/生成器的大小达到可能的最大值时,返回此字符串
在客户端,提取以字符分隔的字符串,将其转换为数值,从该值中获取字节,并连接这些字节以重新创建二进制文件



1在ASCII码中,前32个字符是非打印控制字符,最初用于控制电传打字机的行为,使其执行诸如鸣钟、备份一个字符、移动到新行以及将托架移动到行首等操作。在这32个控制字符中,只有换行符、回车符和水平制表符这三个字符通常出现在文本文件中。

将二进制文件块读取为文本,然后发送该文本,只有一个问题。问题是转换后的文本不会返回创建此文本的二进制文件

在一个足够低的抽象层次上,如果不这样理解,就足够简单了,所有文件都是“二进制”的,因为它们只包含一组以二进制形式编码的数字

但是,区分以下内容是非常重要的

  • 文本文件,其中所有数字都可以解释为代表人类可读文本的字符,以及
  • 二进制文件,其中包含的数据如果被解释为字符,将产生不可打印的字符。1
因此,我们可以读取一个二进制文件,其中可能包含用于产生声音的字节组合,因为它是不可打印的,所以它将无法恢复地丢失。有用于移动光标位置的字节组合。一旦你击中一个,你就失去了定位

转换为文本时,不仅会丢失任何控制字符,而且整个可打印文本也将不在适当位置,从而导致二进制文件出现混乱

因此,二进制到文本到二进制的转换是有损的。


可供替代的 mo