将unicode字符串编码为字节数组C ++和C#

时间:2015-10-12 12:35:47

标签: c# c++ unicode

我有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); ??

欢迎提出反馈和意见。在我的推理中我错了吗?感谢

1 个答案:

答案 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);
}