implementing the byte length field for number of nodes. this makes it possible to correctly represent 128 or more nodes.
This commit is contained in:
parent
790d494da1
commit
1abcc9b425
1 changed files with 25 additions and 1 deletions
26
thing.rb
26
thing.rb
|
@ -385,7 +385,31 @@ if $0 == __FILE__
|
||||||
# size.
|
# size.
|
||||||
|
|
||||||
node_count = node_list.count + 1
|
node_count = node_list.count + 1
|
||||||
file.write([node_count].pack("c"))
|
if node_count < 128
|
||||||
|
file.write([node_count].pack("C"))
|
||||||
|
else
|
||||||
|
bits = Math.log(node_count, 2).ceil
|
||||||
|
bytes = (bits / 8).ceil
|
||||||
|
file.write([128 + bytes].pack("C"))
|
||||||
|
|
||||||
|
# get the correct integer directive for pack()
|
||||||
|
case bytes
|
||||||
|
when 1
|
||||||
|
# 8-bit unsigned
|
||||||
|
directive = "C"
|
||||||
|
when 2
|
||||||
|
# 16-bit unsigned big-endian
|
||||||
|
directive = "n"
|
||||||
|
when 3..4
|
||||||
|
# 32-bit unsigned big-endian
|
||||||
|
directive = "N"
|
||||||
|
else
|
||||||
|
# Give up. This is an impractical number of nodes.
|
||||||
|
puts("Too many nodes.")
|
||||||
|
exit(false)
|
||||||
|
end
|
||||||
|
file.write([node_count].pack(directive))
|
||||||
|
end
|
||||||
|
|
||||||
bit_file = BitWriter.new file
|
bit_file = BitWriter.new file
|
||||||
binary_write(bit_file, [parent] + node_list, string_huff, node_huff)
|
binary_write(bit_file, [parent] + node_list, string_huff, node_huff)
|
||||||
|
|
Loading…
Reference in a new issue