为 RPC 编码字符串和整数

Encoding strings and ints for a RPC

我需要做一个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);

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

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

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

像这样将单词放入缓冲区

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

将 puts 行更改为 read

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