一直在做服务器相关的东西,消息的定制方式中有相关的字段以确定消息字段的长度,而服务器以前都是用c++实现的,一般的实现方式如下(其中假设消息长度为256):
  1. char buff[SIZE] = {0};
  2. char *p = buff;
  3. *(int *)p = 256;
而到了其他一些没有指针的语言中这样的处理就犯了难,比如说客户端中会遇到的各种语言,我分别在C#(安全的)和ruby中处理过这样的问题。
以下是我在ruby中的解决办法(安全的C#的解决办法我会在下一篇博文中讲述):

  1. def ConvIntIntoArray(num)
  2.     (num & 0xFF).chr +
  3.         (num >> 8 & 0xFF).chr +
  4.         (num >> 16 & 0xFF).chr +
  5.         (num >> 24 & 0xFF).chr
  6. end

  7. def ConvArrayIntoInt(array)
  8.     array[0].ord +
  9.         (array[1].ord << 8) +
  10.         (array[2].ord << 16) +
  11.         (array[3].ord << 24)
  12. end

  13. def ConvShortIntoArray(num)
  14.     (num & 0xFF).chr +
  15.         (num >> 8 & 0xFF).chr
  16. end

  17. def ConvArrayIntoShort(array)
  18.     array[0].ord +
  19.         (array[1].ord << 8)
  20. end
可以看到,即使是ConvIntIntoArray返回的字符串仍然可以使用+号拼接字符串,这点让人感觉非常贴心,也是ruby人性化的体现吧。

09-04 08:09