ABOUT ME

-

Total
-
  • Elixir 언어: bitstring
    컴퓨터 2022. 1. 24. 23:34
    728x90
    반응형

     

    Elixir 언어

     

    elixir-lang.github.com

    Website for Elixir

    elixir-lang.org

     

    소개

    패킷에서 bits/bytes 처리 좀 공부하다가 아래처럼 bit shift/wise 할 수 있는데 가독성이 좀 떨어지긴 하는 것 같다.

    // Moderately readable bitwise and
    a[1]= bitfield[1] & 0b0000_0100 > 1;
    
    // Moderately readable bit shifting
    bits_0 += ((self.id[0] > 1) as u8)<<4;

    근데 Elixir란 언어에서는 bitstrings 라는 개념이 있어 더 깔끔하고 간결하게 작성할 수 있다고 해서

    궁금해서 찾아봤다.

     

    Bitstring

    ( = bit array, bits를 압축하여 저장하는 배열 데이터 구조)

    모든 binary는 bitstring 인데 모든 bitstring은 binary가 될 필요는 없다.

    elixir 언어에서는 바이너리를 <<>>로 표현한다. 아래는 elixir console

    또한 모든 strings는 binaries라고 한다.

    iex> data = <<"hello">>
    "hello"
    iex> is_binary data
    true
    iex> is_bitstring data
    true
    iex> data2 = <<1,2,3::4>>
    <<1, 2, 3::size(4)>>
    iex> is_bitstring data2
    true
    iex> is_binary data2
    false
    
    iex> byte_size "hello"
    5
    iex> String.graphemes "hello"
    ["h", "e", "l", "l", "o"]
    iex> String.valid? <<35>>
    true
    iex> <<35>>
    "#" // valid string

     

    bits 개수가 8의 배수면 binary라고 부른다.

    <<1,2,3::4>> = 00000001 00000010 0011

    위의 코드는 총 20 bits가 되어 바이너리가 아니다. (사이즈 표기 안하면 자동 8bits임)

    <<0::1, 0::1 ..., 1::1>>= 00100011 (8bits), 즉 ASCII로 #임

    iex> match?("#", <<35>>)
    true
    iex> match? "#", <<0::1, 0::1, 1::1, 0::1, 0::1, 0::1, 1::1, 1::1>>
    true 
    iex> match? <<35>>, <<0::1, 0::1, 1::1, 0::1, 0::1, 0::1,1::1,1::1>>
    true

    아래처럼 이용할 수 있다. 8비트씩 6문자 스킵하고 substring에 간편히 저장했다.

    iex> name = "hello I am substring"
    
    iex> <<_skip:: 6*8, substring::binary>> = name
    
    iex> substring
    "I am substring"

     

    728x90

    '컴퓨터' 카테고리의 다른 글

    wsl에서 OneDrive 폴더 연결  (0) 2022.04.25
    Zorin OS 16 사진  (0) 2021.08.24
    NanoID: 범영 고유 식별자 UUID 대체?  (0) 2021.07.02

    댓글