KEEP K.I.S.S.

tk's blog

protobuf 跨语言使用字符串编码问题

    好久没更新了..... 这段时间,咳

    最近公司项目组有个需求,就是用C++写一个可供 Android 和 WinCE 的跨平台语言底层调用,从下层向上层传递数据。背景是之前项目是在 WinCE 上做的,开发语言是 C#, 现在在开发 Android 的版本,所以想把底层涉密的底层算法用 C++ 重做,同时反馈给之前的 CE 版本。

    跨语言调用传递数据主要就是一个协议,因为不管传递什么数据,底层来说都是一丢丢的字节流,这里只要能从字节流中解析出一致的数据就可以。这里准备采用 google 的 protobuf。

    官方的 protobuf 默认支持三种语言,C++/Java/Python,支持 C# 的有社区版本,protobuf-csharp-port 。

    今天就测试了下从 C++ 传递数据到 C# 中解析的情况,这里暂时没有考虑跨语言直接调用,而是用 C++ 版本 序列化一个文件然后让 C# 版本解析。这之中,如果 .protoc 文件string 定义的字段都是使用 ASCII 编码的话,是没有什么问题的。如果用到中文,这里到 C# 里就会乱码,很常见的编码问题 Orz。主要问题还是 VS 的 C++ 文件编码,因为 VS 默认是 本地编码(中文的就是 GBK),所以里面字符串字面量也是本地编码,如果你把文件编码转换为  UTF-8 无 BOM,会无法编译,如果转换为 UTF-8 带 BOM 格式,VS 编译过程中会把UTF-8带BOM格式文件转换为本地编码.....蛋疼。所以在 C++ 版本里用了一个 GBK 转 UTF-8 的函数,把 GBK 编码的 string 转为 UTF-8 编码的 string,然后序列化。再到 C# 中解析就正常了。如果在 C++版本中不转换而在 C# 中转换编码的话,我找了但是貌似没找到可行的方法。

    无力吐槽 VS 的文件编码处理了。统一向 UTF-8 靠拢才是良策。PS: 貌似 C# 默认写入文件编码就是 UTF-8(待确认)。

    UTF-8 编码避免了字节序(大小端)问题,适合通信。 UTF-16 就很适合本地使用。

    顺便吐槽一下 ParseFromArray 这个 API ,第二个参数必须正好是数组里存放的 message 的 ByteSize 大小,大一点也不行, 所以不能传递数组的大小。原因。所以最好在序列化之前写入 ByteSize 大小用以标识。

DLL 导出函数以及DEF文件的作用相关链接

一下午都在研究 def 文件为什么能无修饰名的导出函数名到dll,然后找了好几篇文章,推荐两个:

http://archive.cnblogs.com/a/2196642/   编写DLL所学所思(1)——导出函数

http://hi.baidu.com/luosiyong/blog/item/3d68f3fc68a01098b801a045.html dll的def文件与__declspec(dllexport)导出函数方式比较

 

def 文件不会影响生成的导入库文件(.lib),def文件可以指定导出别名。在 C 和 C++ 混合DLL编程中就需要注意了,def 文件并不能很自然地 隐式链接调用DLL,因为头文件声明的函数名和导入库(.lib)中的符号名并不对应(除非使用 extern "C" 声明),因为 C 编译器和 C++编译器(或者不同C++编译器)中的函数名修饰规则并不相同。

以前写的一些东西

  • 一个C++的矩阵模板类,带有常见运算和求逆等功能:Matrix.zip
  • 一个VC6.0写的右键打开菜单添加器,源码程序

 

也就这些了,以前放在GAE搭建的博客上,现在上不去了,而且GAE收费了,所以转移下。

指针也许比引用更好~。~

 

        这是Qt开发者网站的一片文章的节选,讲述API的设计原则的,里面有一段关于C++中需要修改实参的函数的参数是选择指针还是引用的区别。然后,Qt里面选择了指针。因为调用这种函数的时候可以让人一眼看出这个函数调用会修改实参的值。

原文章:http://developer.qt.nokia.com/wiki/API_Design_Principles

C++ Specifics

Value vs. Object

Pointers vs. References

Which is best for out-parameters, pointers or references?

 

void getHsv(int *h, int *s, int *v) const
void getHsv(int &h, int &s, int &v) const

Most C++ books recommend references whenever possible, according to the general perception that references are “safer and nicer” than pointers. In contrast, we at Qt Software tend to prefer pointers because they make the user code more readable. Compare:

 

color.getHsv(&h, &s, &v);
color.getHsv(h, s, v);

Only the first line makes it clear that there’s a high probability that h, s, and v will be modified by the function call.

 

Qt Creator 2.1.0

之前一直都是直接下 Qt windows sdk 集成开发环境,这个最新的是带着 Qt 4.7.0 和 Qt Cretor 2.0.1。

最新的Qt 库是4.7.2,Qt Cretor 是 2.1.0,但是没有提供组合的 sdk集成环境包下载。

新的 2.1.0的Qt Creator 更新比较大,界面支持全中文显示,插件也有新的,支持类视图浏览了,不用再单独去下第三方的cppsupport了,代码显示上也有更新,我发现的就是虚函数显示会是斜体,具体应该是高亮显示更加细化了。

Qt Creator 真是越用越好用了。