mirror of
https://github.com/maddievision/Celestial.git
synced 2024-08-14 23:55:37 +00:00
Add binwriter class
This commit is contained in:
parent
1685b32536
commit
fc5c15fe8e
1 changed files with 123 additions and 0 deletions
123
binwriter.rb
Normal file
123
binwriter.rb
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
16# 8 16 32 64
|
||||||
|
# C S L Q - unsigned
|
||||||
|
# c s l q - unsigned
|
||||||
|
# < LE
|
||||||
|
# > BE
|
||||||
|
# A - binary string
|
||||||
|
# z - null terminated
|
||||||
|
# H - hex string
|
||||||
|
|
||||||
|
|
||||||
|
class BinWriter
|
||||||
|
def initialize fn
|
||||||
|
@f = File.new fn, "wb"
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.open fn, &block
|
||||||
|
f = BinWriter.new fn
|
||||||
|
block.call f
|
||||||
|
f.close
|
||||||
|
end
|
||||||
|
|
||||||
|
def seek pos
|
||||||
|
@f.seek pos
|
||||||
|
end
|
||||||
|
|
||||||
|
def tell
|
||||||
|
@f.tell
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_str str
|
||||||
|
@f.write str
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_str_varlen str
|
||||||
|
write_varlen_le str.size
|
||||||
|
@f.write str
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_byte val
|
||||||
|
@f.write [val].pack("C")
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_bool val
|
||||||
|
write_byte val ? 1 : 0
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_u16_le val
|
||||||
|
@f.write [val].pack("S<")
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_s16_le val
|
||||||
|
@f.write [val].pack("s<")
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_u16_be val
|
||||||
|
@f.write [val].pack("S>")
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_u32_le val
|
||||||
|
@f.write [val].pack("L<")
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_s32_le val
|
||||||
|
@f.write [val].pack("l<")
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_u32_be val
|
||||||
|
@f.write [val].pack("L>")
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_f32_le val
|
||||||
|
@f.write [val].pack("e")
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_u24_be val
|
||||||
|
write_byte val >> 16
|
||||||
|
write_u16_be val & 0xFFFF
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_bin str
|
||||||
|
@f.write str
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_varlen_be val
|
||||||
|
out = [val & 0x7F]
|
||||||
|
val = val >> 7
|
||||||
|
while val > 0
|
||||||
|
out << (val & 0x7f) + 0x80
|
||||||
|
val = val >> 7
|
||||||
|
end
|
||||||
|
out.reverse.each do |x|
|
||||||
|
write_byte x
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_varlen_le val
|
||||||
|
out = [val & 0x7F]
|
||||||
|
val = val >> 7
|
||||||
|
while val > 0
|
||||||
|
out << (val & 0x7f)
|
||||||
|
val = val >> 7
|
||||||
|
end
|
||||||
|
out.each_with_index do |x, i|
|
||||||
|
write_byte(x + ((i == out.size - 1) ? 0 : 0x80))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_binswap str
|
||||||
|
togo = str.size
|
||||||
|
pos = 0
|
||||||
|
while togo > 0
|
||||||
|
r = @rom[pos..(pos+3)].unpack('L>')
|
||||||
|
d = r.pack('L<')
|
||||||
|
write_bin d
|
||||||
|
pos += 4
|
||||||
|
togo -= 4
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def close
|
||||||
|
@f.close
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue