将多个字符串转换为一个字节[]

时间:2017-04-12 18:30:16

标签: c# string encoding byte

我必须从SOAP调用和SQL Server调用中检索许多Unicode字符串。然后,我必须将所有内容转换为UTF7中的byte [],以便它可以通过套接字发送到服务器,期望UTF7字节串。因为我必须在每个字符串后面插入控制字节,所以我不能连接字符串并使用一个编码调用。 (简化代码示例):

Encoding enc = Encoding.UTF7;
byte[] bytes = new byte[16384];
int idx = 0;
bytes[idx++] = 11; // Starting control code

// create an array of strings from different sources.
string[] strs = GetTheStrings();

foreach (string str in strs)
{
   bytes[idx] = enc.GetBytes(str); // Error

   idx += enc.GetByteCount(str);
   bytes[idx++] = 13;  // line ending CR


}
bytes[idx] = 28; // ending control code

return bytes;

我从VS那里得到一个错误,说是enc.GetBytes(str); "无法将类型byte []显式转换为byte&添加了一些需要覆盖Encoding类的内容。为什么VS对字节[idx]的处理方式与byte [] bytes2不同,后者以字符串为基础进行处理?我习惯使用C / ++,Java和许多其他语言,但C#总是让我感到困惑。我不想使用不安全的代码块来使用指针来执行此操作,这将非常容易,因为其他不了解指针和内存管理的人将不得不维护它。鉴于字节[idx]指的是单个字节,而不是它所期望的数组,是否有某种类型的转换可以用来通过它?是否有更好的拟合方法?

我已经使用示例代码查看了十几个网站,但这个多字符串问题永远不会显示出来。我应该将每个字符串加载到单独的byte []中,然后在末尾合并它们吗?

3 个答案:

答案 0 :(得分:1)

您正尝试将字节数组分配给单个byte

您需要单独分配每个byte

var bytes = enc.GetBytes(str);
foreach(var b in bytes)
{
    bytes[idx++] = b;
}

在此之后,您无需使用idx更新idx += enc.GetByteCount(str);

答案 1 :(得分:1)

Encoding.GetBytes已经完成了将数据复制到同一个数组的大部分工作,唯一需要的步骤是获取数组的大小,这也包含在同一篇MSDN文章中:

  

要计算GetBytes存储结果字节所需的确切数组大小,应调用GetByteCount方法。要计算最大数组大小,请调用GetMaxByteCount方法。 GetByteCount方法通常允许分配更少的内存,而GetMaxByteCount方法通常执行得更快。

只需为每个字符串调用.cslot_c941,然后调用GetByteCount增加偏移量。

答案 2 :(得分:0)

哎呀。我决定用C语言(不安全的代码)来做这件事,并且对那些可能会跟随的人做好评论。