【问题标题】:Encoding strings and ints for a RPC为 RPC 编码字符串和整数
【发布时间】:2015-04-26 11:40:18
【问题描述】:

我需要进行 RPC。我正在尝试编码函数名称的长度,后跟函数的名称。

Function name: say_hello
Function name length: 9
Encoded array: [9, 's', 'a', 'y', ..., 'l', 'l', 'o']

到目前为止:

unsigned char* encode_int(unsigned char *buffer, int value) {
  buffer[0] = value >> 24;
  buffer[1] = value >> 16;
  buffer[2] = value >> 8;
  buffer[3] = value;
  return buffer + 4;
}

char* function_name = "say_hello";
char* buffer[256];
buffer = encode_int(&buffer, strlen(function_name));
strcpy(buffer, function, strlen(function_name));
puts(buffer);

【问题讨论】:

  • 你有什么问题?
  • @atuos 我不能让它工作,你能提供一个如何正确做的例子吗?谢谢。
  • 你怎么知道它不起作用?你希望 puts() 打印 '9say_hello' 吗?
  • 看起来你有几个问题,你不应该在 Encode_int 的函数定义中使用 unsigned char。此外,当您调用它时,您使用 &buffer 而不是正确的缓冲区

标签: c function rpc


【解决方案1】:

您的代码有很多问题。我不仅会给你一个可行的解决方案,还会指出问题。首先是代码显然无法编译。您将未定义的变量 function 传递给 strcpy 并给 strcpy 提供太多参数。我假设您只是错误地转录了该程序。但是,即使您修复了该问题,您也会收到一些编译器警告,如果注意这些警告,将会发现您的大部分问题。

  1. 您将buffer 的地址而不是buffer 本身传递给encode_int
  2. 您将buffer 声明为一个字符数组指针。看起来您真正想要的是char 的数组。
  3. 您将一个 int 编码到缓冲区的开头。然后您尝试将其打印为字符串(通过puts)。那是行不通的,并且会导致没有输出(正如您可能已经发现的那样)。因为 int 在第一个字节中将有一个 0 值(因为您已经对其进行了编码)。这是字符串的空终止符,因此是空白输出。

编辑:更正第 3 点。您实际上将 buffer 增加了 4(如果其他所有内容都已修复)。所以puts 只会显示函数名称(同样,如果其他所有内容都已修复)。而且您实际上已经丢失了函数名称的长度。

【讨论】:

    【解决方案2】:

    像这样将单词放入缓冲区

    int len;
    len=Strlen(word);
    memcpy(buffer,&len,sizeof(Int));
    strncpy (&buffer[sizeof (int)],word,len);
    

    将 puts 行更改为读取

    printf("%d %s\n",buffer,&buffer[sizeof (int)]);
    

    【讨论】:

      猜你喜欢
      • 2020-07-05
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多