การจับคู่รูปแบบไบนารี Elixir ของจำนวนเต็มหรือแปลงจำนวนเต็มเป็นไบนารี

วันนี้ฉันเพิ่งเริ่มเรียน Elixir และติดอยู่กับการจับคู่รูปแบบของ Integer

ฉันรู้ดีว่าจะจับคู่ ไบนารี่ อย่างไร แต่ไม่พบวิธีจับคู่ จำนวนเต็ม เช่น แยกไบต์สูงออกจากจำนวนเต็มธรรมดา ฉันต้องแปลงจำนวนเต็มเป็นไบนารี่หรือเขียนฟังก์ชันที่รับไบต์สูงจาก จำนวนเต็ม แต่ไม่พบสิ่งใดใกล้เคียงในไลบรารี

<<y1::size(8), y2::size(8),  y3::size(8), y4::size(8) >> = t

โดยที่ t คือ Integer ตามที่คุณอาจคาดเดาได้

** (MatchError) no match of right hand side value: 3232235521

person Dmitry Dyachkov    schedule 28.03.2017    source แหล่งที่มา


คำตอบ (1)


คุณสามารถแปลงจำนวนเต็มเป็นไบนารีได้โดยใช้ <<x::32>> (ซึ่งย่อมาจาก <<x::size(32)>>) สิ่งนี้จะแปลงโดยใช้ลำดับไบต์ Big Endian สำหรับ Little Endian คุณต้องเติม -little เช่น <<x::little-32>> จากนั้นคุณสามารถแยกออกได้โดยใช้รูปแบบที่คุณกล่าวถึงแล้ว (ฉันย่อให้สั้นลงอีกครั้งเพื่อลบ size() เนื่องจากไม่จำเป็น):

iex(1)> <<y1::8, y2::8, y3::8, y4::8>> = <<3232235521::32>>
<<192, 168, 0, 1>>
iex(2)> {y1, y2, y3, y4}
{192, 168, 0, 1}
iex(3)> <<y1::8, y2::8, y3::8, y4::8>> = <<3232235521::little-32>>
<<1, 0, 168, 192>>
iex(4)> {y1, y2, y3, y4}
{1, 0, 168, 192}

เนื่องจากคุณมีจำนวนเต็มอยู่แล้ว คุณจึงสามารถแยกไบต์เหล่านี้ได้โดยใช้ตัวดำเนินการ Bitwise แต่จะอ่านได้น้อยกว่ามาก:

iex(1)> use Bitwise
Bitwise
iex(2)> n = 3232235521
3232235521
iex(3)> n &&& 0xff
1
iex(4)> n >>> 8 &&& 0xff
0
iex(5)> n >>> 16 &&& 0xff
168
iex(6)> n >>> 24 &&& 0xff
192
person Dogbert    schedule 28.03.2017