-
Elixir 언어: bitstring컴퓨터 2022. 1. 24. 23:34728x90반응형
Elixir 언어
소개
패킷에서 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