Actions
Feature #18254
closedAdd an `offset` parameter to String#unpack and String#unpack1
Status:
Closed
Assignee:
-
Target version:
-
Description
When working with binary protocols it's common to have to first unpack some kind of header or type prefix, and then based on that unpack another part of the string.
For instance here's a code snippet from Dalli, the most common Memcached client:
while buf.bytesize - pos >= 24
header = buf.slice(pos, 24)
(key_length, _, body_length, cas) = header.unpack(KV_HEADER)
if key_length == 0
# all done!
@multi_buffer = nil
@position = nil
@inprogress = false
break
elsif buf.bytesize - pos >= 24 + body_length
flags = buf.slice(pos + 24, 4).unpack1("N")
key = buf.slice(pos + 24 + 4, key_length)
value = buf.slice(pos + 24 + 4 + key_length, body_length - key_length - 4) if body_length - key_length - 4 > 0
pos = pos + 24 + body_length
begin
values[key] = [deserialize(value, flags), cas]
rescue DalliError
end
else
# not enough data yet, wait for more
break
end
end
@position = pos
Proposal¶
If unpack
and unpack1
had an offset:
parameter, it would allow this kind of code to extract the fields it needs without allocating and copying as much strings, e.g.:
flags = buf.slice(pos + 24, 4).unpack1("N")
could be:
buf.unpack1("N", offset: pos + 24)
Actions
Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0