如何在xml字符串中发送二进制数据

我想以下面的xml格式将二进制文件发送到.net c#组件

   

在被调用的组件中,我将使用上面的xml字符串,并将BinaryFileString标记中接收的二进制字符串转换为filetype =”属性指定的文件。 文件类型可以是doc / pdf / xls / rtf

我在调用应用程序中有代码从要发送的文件中取出字节。 如何准备它与包裹在其周围的xml标签一起发送? 我希望应用程序向组件发送一个字符串而不是字节流。 这是因为我无法通过查看字节流来解密文件类型[pdf / doc / xls]。 因此具有filetype属性的xml字符串。 有什么想法吗?

提取下面的字节的方法

  FileStream fs = new FileStream(_filePath, FileMode.Open, FileAccess.Read); using (Stream input = fs) { byte[] buffer = new byte[8192]; int bytesRead; while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) {} } return buffer; 

谢谢。

编辑:

只是为了澄清为什么我使用xml字符串而不是在我的组件上设置属性。 实际上我的调用应用程序试图模拟Siebel如何调用我的组件。 http://download.oracle.com/docs/cd/E05553_01/books/eScript/eScript_JSReference244.html#wp1014380我不确定Siebel是否可以根据需要设置我的组件属性。 所以我正在研究它在xml中发送数据的角度。

Base64表示通常用于表示二进制数据。

 public void EncodeWithString() { System.IO.FileStream inFile; byte[] binaryData; try { inFile = new System.IO.FileStream(inputFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); binaryData = new Byte[inFile.Length]; long bytesRead = inFile.Read(binaryData, 0, (int)inFile.Length); inFile.Close(); } catch (System.Exception exp) { // Error creating stream or reading from it. System.Console.WriteLine("{0}", exp.Message); return; } // Convert the binary input into Base64 UUEncoded output. string base64String; try { base64String = System.Convert.ToBase64String(binaryData, 0, binaryData.Length); } catch (System.ArgumentNullException) { System.Console.WriteLine("Binary data array is null."); return; } // Write the UUEncoded version to the XML file. System.IO.StreamWriter outFile; try { outFile = new System.IO.StreamWriter(outputFileName, false, System.Text.Encoding.ASCII); outFile.Write(""); outFile.Write(base64String); outFile.Write(""); outFile.Close(); } catch (System.Exception exp) { // Error creating stream or writing to it. System.Console.WriteLine("{0}", exp.Message); } } 

在接收端,您可以撤消此操作并获取原始文件内容,如下所述。

  // Convert the Base64 UUEncoded input into binary output. byte[] binaryData; try { binaryData = System.Convert.FromBase64String(base64String); } catch (System.ArgumentNullException) { System.Console.WriteLine("Base 64 string is null."); return; } catch (System.FormatException) { System.Console.WriteLine("Base 64 string length is not " + "4 or is not an even multiple of 4." ); return; } 

你可以BASE64你的字节? MSDN ref: Convert.ToBase64 , Convert.FromBase64String

扩展@ russau的答案它会像这样工作:

 var s = "Hello World"; var b = Encoding.Default.GetBytes(s); var bstr = Convert.ToBase64String(b); Console.WriteLine("Original String:" + s); Console.WriteLine("Base64 String:" + bstr); var fromBStr = Convert.FromBase64String(bstr); var st = Encoding.Default.GetString(fromBStr); Console.WriteLine("Converted string: " + st); 

你不需要前两行:

 var s = "Hello World"; var b = Encoding.Default.GetBytes(s); 

因为你已经有一个字节数组。 我使用字符串来表明,当你从Convert.FromBase64String转换字节数组时,你得到的结果与你开始的完全相同

您提到您正在调用C#组件。 我不确定我理解为什么使用这个组件意味着你需要创建一个XML字符串。

是否可以定义类来保存数据而不是使用XML字符串? 例如

 public enum FileType { Word, Excel, RichText, PDF } public class FileData { public FileType TypeOfFile { get; set; } public byte[] Data { get; set; } } 

然后组件的调用者只设置FileType和byte []。 然后将更明确地定义组件的接口(FileData类,而不是更通用的字符串或XmlDocument)。