Skip to content

Instantly share code, notes, and snippets.

@elorest
Created April 8, 2021 01:39
Show Gist options
  • Save elorest/6ccb1cdde98e7ef2b79f6f7429bf2918 to your computer and use it in GitHub Desktop.
Save elorest/6ccb1cdde98e7ef2b79f6f7429bf2918 to your computer and use it in GitHub Desktop.
# TODO: Write documentation for `CanMapper`
module CanMapper
VERSION = "0.1.0"
# TODO: Put your code here
end
class BitMapper(T)
property buffer : T
def initialize(@buffer : T)
end
def to_bytes(v : T, sze = sizeof(T))
puts sze
Bytes.new(pointerof(v).as(Pointer(UInt8)), sze)
end
def get_slice_le(start = 0, size = 16, prim = UInt32)
shift = start
n = (@buffer >> shift) & ((1_u64<<size)-1)
b = to_bytes(n)
IO::ByteFormat::LittleEndian.decode(prim, b)
end
def get_slice_be(start = 0, size = 1, prim = UInt32)
d, m = start.divmod(8)
shift = (((64 - (d*8))-(7-m))) - size
# 10101001,11001010,10101010,10110010,10111100,00101010,10101000,10100011
# 10100011,10101000,00101010,10111100,10110010,10101010,11001010,10101001
buffer = IO::ByteFormat::BigEndian.decode(T, to_bytes(@buffer))
n = (buffer >> shift) & ((1_u64<<size)-1)
b = to_bytes(n)
IO::ByteFormat::LittleEndian.decode(prim, b)
end
# def set_slice_be(start = 0, size = 1, value)
#
# d, m = start.divmod(8)
# shift = (((64 - (d*8))-(7-m))) - size
# # 10101001,11001010,10101010,10110010,10111100,00101010,10101000,10100011
# # 10100011,10101000,00101010,10111100,10110010,10101010,11001010,10101001
#
# buffer = IO::ByteFormat::BigEndian.decode(T, to_bytes(@buffer))
# n = (buffer >> shift) & ((1_u64<<size)-1)
# b = to_bytes(n)
# IO::ByteFormat::LittleEndian.decode(prim, b)
# end
end
buffer = 0b1010100111001010101010101011001010111100001010101010100010100011_u64
bm = BitMapper(UInt64).new(buffer)
bytes = buffer.to_s(2).chars.each_slice(8).map{|a| a.join}.join(",")
puts bytes
puts bytes.split(",").reverse.join(",")
puts bm.get_slice_le(0, 16, Int16)
puts bm.get_slice_le(0, 16, Int16).class
# puts bytes.reverse.join(",")
# puts bm.first_16_signed
# puts bm.first_16_signed[0].to_s(2)
# puts bm.first_16_signed[1].to_s(2)
# puts bm.first_16_signed[0].to_s(2).size
# puts bm.first_16_signed
# puts bm.first_16_signed[0].to_s(2)
# puts bm.first_16_signed[1].to_s(2)
# puts bm.first_16_signed[0].to_s(2).size
# puts "********************************************************************************"
#
# puts bm.big_e_23_16
# puts bm.big_e_23_16[0].to_s(2)
# puts bm.big_e_23_16[1].to_s(2)
# puts bm.big_e_23_16[0].to_s(2).size
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment