我需要将 Ruby 与 C 函数接口,该函数在固定大小的缓冲区(16 字节长度)上执行低级字节操作。
我还应该提到,我为此使用了 Ruby 1.8.7,所以 Ruby 试图找出编码并不令人头疼。
void transmogrify(unsigned char *data_in, unsigned_char *data_out)
{
unsigned char buffer[16];
for(i=0;i<16;i++) {
buffer[i] = data_in[i] << 2; // some low level operations on 8-bit values here
}
memcpy(data_out, buffer, sizeof(buffer));
}
如何在我的库中编写 Ruby C 接口代码,以便正确处理字符串中的二进制数据?例如,它对固定长度输入字符串中的零字节具有鲁棒性吗?
如果我使用 StringValuePtr() 它会在零字节处中断。
static VALUE mygem_transmogrify(VALUE self, VALUE input)
{
unsigned char output[16]
if (TYPE(input) != T_STRING) { return Qnil; } // make sure input is a String
StringValuePtr(input); // <--- THIS does not like zero bytes in the string
transmogrify( (unsigned char *) RSTRING_PTR(input) , (unsigned char *) output);
return rb_str_new( (char *) output, 16);
}
我想从 Ruby 中调用它,如下所示:
input_string = File.read( 'somefile') # reads 16 bytes binary
output = MyGem.transmogrify( input_string ) # output should be 16 bytes binary
=> ... in 'transmogrify': string contains null butye (ArgumentError)