在函数之间传递字符串时,二进制数据被破坏

时间:2017-03-02 15:23:38

标签: c# .net io

希望这是一个容易解决的微不足道的问题。

我试图将二进制文件的内容从一个位置移动到另一个位置但是有一个扭曲:我需要将它作为字符串传输,这是文件最终与源不同的地方。

通过字符串传输它的原因是加载文件的代码和保存文件的代码只通过主机进行通信(这是一个C#MEF应用程序),界面强制我通过字符串,没别的。

所以我正在做的就是这个(伪' ish,只剩下核心功能):

// This part loads a binary file

string output = string.Empty; // The data to be transfered
byte[] fileContent; // The binary file content

fileContent = File.ReadAllBytes(fileName);

output = Encoding.Default.GetString(fileContent);
//output = Convert.ToBase64String(fileContent);
//output = Encoding.UTF7.GetString(fileContent);
//output = Encoding.UTF8.GetString(fileContent);
//output = Encoding.UTF32.GetString(fileContent);
//output = Encoding.ASCII.GetString(fileContent);
//output = Encoding.BigEndianUnicode.GetString(fileContent);
//output = Encoding.Unicode.GetString(fileContent);

然后将字符串转移到其目标部分:

// This part saves a binary file

string input; // This is the data recieved
byte[] content = Encoding.Unicode.GetBytes(input);

File.WriteAllBytes("c:\test.png", content);

目标文件现在与源文件略有不同,如果我使用适当的工具查看文件,那么这里和那里都是一个字节。我在发送部分使用的编码效果最好的是Unicode。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

就像在评论中所说的那样,最安全的选择是使用Base-64。但是如果你想要更高的效率,任何没有间隙的简单8位编码都应该有效,只要你使用相同的编码来解码它。简单来说,我的意思是不是任何Unicode多字节编码。我相信ASCII也不会起作用,因为它是7位的。

关于效率的注意事项:每个字节实际上存储在2个字节中,因为C#中的字符串内部存储在unicode中。但是使用Base-64,你就可以为二进制文件的每3个字节使用8个字节。

我尝试使用Encoding.GetEncoding(437)并在本地系统上运行:

var b = new byte[256];
for (int i = 0; i < 256; i++)
    b[i] = (byte)i;

var encoding = System.Text.Encoding.GetEncoding(437);
var s = encoding.GetString(b);
var b2 = encoding.GetBytes(s);

for (int i = 0; i < 256; i++)
    if (b2[i] != i)
        Console.WriteLine("Error at " + i);