我必须从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 []中,然后在末尾合并它们吗?
答案 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语言(不安全的代码)来做这件事,并且对那些可能会跟随的人做好评论。