End of Life Ruby 3.2 has reached end of life and gets no more fixes. Switch to Ruby 4.0 →
IO::Buffer#get_value
static VALUE
io_buffer_get_value(VALUE self, VALUE type, VALUE _offset)
{
const void *base;
size_t size;
size_t offset = NUM2SIZET(_offset);
rb_io_buffer_get_bytes_for_reading(self, &base, &size);
return rb_io_buffer_get_value(base, size, RB_SYM2ID(type), &offset);
}
Read from buffer a value of type at offset. data_type should be one of symbols:
-
:U8: unsigned integer, 1 byte -
:S8: signed integer, 1 byte -
:u16: unsigned integer, 2 bytes, little-endian -
:U16: unsigned integer, 2 bytes, big-endian -
:s16: signed integer, 2 bytes, little-endian -
:S16: signed integer, 2 bytes, big-endian -
:u32: unsigned integer, 4 bytes, little-endian -
:U32: unsigned integer, 4 bytes, big-endian -
:s32: signed integer, 4 bytes, little-endian -
:S32: signed integer, 4 bytes, big-endian -
:u64: unsigned integer, 8 bytes, little-endian -
:U64: unsigned integer, 8 bytes, big-endian -
:s64: signed integer, 8 bytes, little-endian -
:S64: signed integer, 8 bytes, big-endian -
:f32: float, 4 bytes, little-endian -
:F32: float, 4 bytes, big-endian -
:f64: double, 8 bytes, little-endian -
:F64: double, 8 bytes, big-endian
A data type refers specifically to the type of binary data that is stored in the buffer. For example, a :u32 data type is a 32-bit unsigned integer in little-endian format.
Example:
string = [1.5].pack('f') # => "\x00\x00\xC0?" IO::Buffer.for(string).get_value(:f32, 0) # => 1.5