C++ 字符串 C#解析后 两个字符串无法连接

65 篇文章 2 订阅

1, C++ 字符串的处


#define	LEN_NAME                 32
#define	LEN_ID                         32
#define	LEN_ADDRESS           256
#define    DEFAULT_BUFLEN    1024*40

class PartNode
{
public:
	NodeType		nodeType;		// 节点类型
	//wchar_t			name[LEN_NAME];		// 节点名称
	char name[LEN_NAME];
	char ID[LEN_ID];


	char FBX_address[LEN_ADDRESS];

	virtual void ToCharArray(char buf[], int & index);

	//bool InitNode(TiXmlElement *xmlNode);

	PartNode(NodeType type) : nodeType(type) {};
	PartNode() : PartNode(NODE_PART) { };
	PartNode(char* buf, int & index);

	virtual ~PartNode();
}

转化字节码

void PartNode::ToCharArray(char buf[], int  & index)
{

	// nodeType
	int len = sizeof(NodeType);
	memcpy_s(&(buf[index]), len, &nodeType, len);
	index += len;



	
	len = sizeof(__int32);
	int count_name = strlen(name) + 1;
	memcpy_s(&(buf[index]), len, &count_name, len);
	index += len;

	len = count_name;
	memcpy_s(&(buf[index]), len, name, len);
	index += len;
	/

	 copy byte count of the object
	//len = sizeof(name);
	//memcpy_s(&(buf[index]), len, name, len);
	//index += len;

c++解析

PartNode::PartNode(char* buf, int& index)
{
	// get value of nodetype
	int  len = sizeof(NodeType);
	memcpy_s(&nodeType, len, &buf[index], len);
	index += len;


	
	len = sizeof(__int32);
	int num_name = 0;
	memcpy_s(&num_name, len, &buf[index], len);				// 拷贝零件ID
	index += len;


	len = num_name;
	memcpy_s(&name, len, &buf[index], len);				// 拷贝零件ID
	index += len;
	
    
	 get value of name
	//len = sizeof(char) * LEN_NAME;
	//memcpy_s(&name, len, &buf[index], len);
	//index += len;   
	 get value of name
	//len = sizeof(char) * LEN_NAME;
	//memcpy_s(&name, len, &buf[index], len);
	//index += len;

	// get value of type
	len = sizeof(char) * LEN_ID;
	memcpy_s(&ID, len, &buf[index], len);
	index += len;

	
	len = sizeof(__int32);
	int num = 0;
	memcpy_s(&num, len, &buf[index], len);				// 拷贝零件ID
	index += len; 


	len = num;
	memcpy_s(FBX_address, len, &buf[index], len);				// 拷贝零件ID
	index += len;
	


	//len = sizeof(FBX_address);
	//memcpy_s(FBX_address, len, &buf[index], len);				// 拷贝零件ID
	//index += len;                  }

C#解析


		public PartNode(byte[] data, ref int index) 
		{

			NodeType = (DataType)BitConverter.ToInt32(data, index);

			int num_name = 0;
			index += sizeof(Int32);
			num_name = BitConverter.ToInt32 (data, index);

			index += sizeof(Int32);
			Name = System.Text.Encoding.Default.GetString (data, index, num_name); }
如果不按实际长度传,C#解析出来的东西没错,但长度“有问题”,其与实际的相同的字符串长度不同。
	index += StringLength.Len_ID;
//			FBX_Address = System.Text.Encoding.Default.GetString (data, index, StringLength.Len_Address);
			//FBX_Address = System.Text.Encoding.Default.GetChars (data, index, StringLength.Len_Address);
			//FBX_Address = Convert.ToString();

			//Debug.Log (FBX_Address);
			//Debug.Log (FBX_Address.Length); 


			//string strs = "file://D:/CPICode/U3DPrefabs/";
			//char[] strsing = "file://D:/CPICode/U3DPrefabs/";
			//Debug.Log (strs.Length);
			///Debug.Log (strsing.Length);

FBX_Address.Length = 143;

strs.Length = 29;

用print时两者的内容是一样的。

但我们预期两者的长度应该相同。

这儿只是为了说明问题的所在,可以写names的字符串来测试。c++上面的转换以name为例。C#的解析以FBX_Address为例。

所以应按实际长度来转换字节码,这时会发现在C#中解析出现的东西因为没有空间放‘\0’而有问题,所以应该strlen(name)+1.

这时会发现在C#中多了一位,多出来的一位就是最后的'\0'。

如果要做两字符串的相加,需要把最后的'\0'删除。

fbx = analyScene.scene.FBX_Address;
 names = analyScene.scene.parts[0].Name;




	        	char[] fbx_char_arry = fbx.ToCharArray();
			char[] fbx_char = {'\0'};
				fbx_string = fbx.TrimEnd (fbx_char);
			char[] fbx_char_ = fbx_string.ToCharArray();
		
			names_string = names.TrimEnd (fbx_char);//这个不要也可以连接成功


//
//			string a = "hello";
//			int alen = a.Length;
//			string b = "world";
//			int blen = b.Length;
//			string c = a + b;
//			string d = string.Concat (a+b);
		
			//path = string.Concat (fbx, names);
		
			paths = fbx_string + names_string;

2  C#字符串思考


把字符串转化为字符数组时,没有 '\0',其长度为4.




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值