我有C ++代码,我想重写为C#。这部分
case ID_TYPE_UNICODE_STRING :
if(items[i].GetUString().length() > 0xFFFF)
throw dppError("error");
//GetUstring returns std::wstring type object
DataSize = (WORD) (sizeof(WCHAR)*(items[i].GetUString().length()));
blob.AppendData((const BYTE *) &DataSize, sizeof(WORD)); //blob is byte array
//GetUstring returns std::wstring type object
blob.AppendData((const BYTE *) items[i].GetUString().c_str(), DataSize);
break ;
基本上将unicode字符串和字符串本身的字节长度序列化为字节数组。
这是我的问题(此代码然后将此数据发送到服务器)。我不知道在上面的代码行中使用了哪种编码(UTF16,UTF8等)。 所以我不知道在C#中重新实现它的最佳方法是什么。 我怎么能猜出这个C ++项目中使用了什么编码?
如果我找不到C ++项目中使用的编码,给定的字节顺序与此question的接受的答案中所述相同,您认为这两种方法(GetBytes)接受的答案中的GetString将对我有用(用于在C ++项目中序列化unicode字符串并将其检索回来)? e.g。
这两个:
static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
static string GetString(byte[] bytes)
{
char[] chars = new char[bytes.Length / sizeof(char)];
System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
return new string(chars);
}
或者我更好地了解C ++项目中使用的编码是什么?
然后我需要以相同的方式从字节数组重构字符串。如果我更好地学习在C ++中使用哪种编码,我如何使用System.Text.ASCII.WhateverEncodingWasUsedinC++.GetByteCount(string);
来获取C#中字符串的长度(以字节为单位)?
PS。你认为C ++代码是以编码不可知的方式工作的吗?如果是,我怎么能在C#中重复这一点?
UPDATE :我猜测使用的编码是UTF16,因为我看到在几个变量名称中提到了,所以我想我会假设使用了UTF16,如果某些东西不起作用在测试期间,寻找替代解决方案。在这种情况下,获取UTF16字符串的字节数的最佳方法是什么?以下方法是OK:System.Text.ASCII.Unicode.GetByteCount(string);
??
欢迎提出反馈和意见。在我的推理中我错了吗?感谢
答案 0 :(得分:0)
更改方法签名,使其获得byte[]
等效的输入字符串。
static byte[] GetBytes(string str)
{
UnicodeEncoding uEncoding = new UnicodeEncoding();
byte[] stringContentBytes = uEncoding.GetBytes("Your string");
return stringContentBytes;
}
反向:
static string GetString(byte[] bytes)
{
UnicodeEncoding uEncoding = new UnicodeEncoding();
string stringContent=uEncoding.GetString(bytes);
return new string(stringContent);
}