2010-06-01 132 views
3

基本上我有二进制数据,我不介意如果它是不可读的,但即时通讯编写它的文件被解析,所以这是重要的换行字符被取出。C#如何从二进制文件中删除换行符?

我想我做了正确的事情时,我转换成字符串....

byte[] b = (byte[])SubKey.GetValue(v[i]); 
s = System.Text.ASCIIEncoding.ASCII.GetString(b); 

,然后取出换行符

String t = s.replace("\n","") 

,但它不工作?

+1

取决于你正在处理的是哪种新行,在windows中它们通常是“\ r \ n”,而不仅仅是“\ n”。如果你想要一些平台独立性,Environment.NewLine可能是有用的。 – axk 2010-06-01 10:35:06

回答

6

换行符可能是\ r \ n,而您的二进制数据可能不是ASCII编码的。

+0

如果不是,我该怎么办?我只需确保不出现换行符。我认为将其转换为字符串将允许我使用String.replace等 – Tom 2010-06-01 10:37:58

+1

那么,你知道关于二进制数据,你从哪里得到它?如果它不是ASCII编码的,你可以尝试Encoding.Default.GetString或Encoding.Unicode.GetString,或者你认为可能是正确的。然后删除\ r \ n的所有事件。 – 2010-06-01 11:04:52

0

首先换行符(Environment.Newline)通常是Windows上的两个字符,你的意思是删除单个回车符或换行符?其次,将文本编码应用于二进制数据可能会导致意外的转换。例如。购买不映射为ASCII字符的二进制数据会发生什么情况?

+0

不管数据是否稍有变化,即时进行完整性检查,只要我将数据设置为将来不会改变,这不是问题。 但即时将这些数据写入文件,我无法解析,因为有时值有很多'新行' – Tom 2010-06-01 10:39:08

0

新行字符可以是\n\r\r\n取决于操作系统类型,为了这是LinuxMacintoshWindows标记。

但是,如果你说你的文件是二进制的,你知道他们在她的内容中有ASCII码换行符?

如果是二进制文件这种可能是一些结构,如果他们结构之后你删除的换行符左移所有数据后,此换行符和损坏的数据在她

+0

数据来自Windows注册表,我使用XP 32 :) – Tom 2010-06-01 10:41:50

0

我会想象删除二进制块中对应于换行的字节实际上会破坏二进制数据,从而使它无用。

也许你最好使用base64编码,它会产生ASCII安全输出。

0

如果这是文本数据,则将其作为文本数据(使用正确的编码)加载,将其替换为字符串,然后重新编码(使用正确的编码)。对于某些编码,您可能可以在文件级别进行交换(不进行解码/编码),但我不会在其上下注。

如果这是任何其他二进制表示形式,您将有知道确切的细节。例如,嵌入在二进制文件的一部分中的字符串具有长度前缀是常见的(但不是确定的)。如果在不更改长度前缀的情况下更改数据,则会损坏文件。要更改长度前缀,您需要知道格式(可能是big-endian/little-endian,任何固定数量的字节,或者前缀本身可能是可变长度)。或者它可能被划定。或者通过文件散布的相对偏移量可能都需要修复。

同样可能;你可能偶然在二进制中有相同的字节序列代表一个换行符;你可能会完全摧毁数据。