카테고리 없음

js 리틀 엔디언과 빅 엔디언

라면군 2023. 1. 11. 01:29
   

 이번 바이너리 파일을 처리하는 과정에 있어 리틀 엔디언과 빅 엔디언의 차이 문제가 생겼는데, 일단 자바 스크립트 환경에서는 무조건 리틀 엔디언 방식으로 처리한다. 즉 파일 바이트 순서가 아래와 같을 때

<리틀 엔디언>

1 , 2, 3, 4, 5, 6, 7, 8,

L                           M

 

가장 첫번째 비트를 LSB, 마지막 비트를 MSB으로 처리한다.

이를 빅 엔디언 방식으로 읽기 위해서 여러 방식을 생각해 봤는데

아래와 같은 방식은 불가능하다.

1. 작은 비트 집합 단위를 순서 거꾸로 읽은 후 처리

 

왜냐면 어떠한 단위 채로 거꾸로 읽어도 집합 채로 거꾸로 붙이는 것이기 때문에 만일

0100 같은 경우 정상적으로는 0010이 되어야 하지만 이 작업 수행이 비트 플랩도 아니고 그냥 하나씩 거꾸로 읽는 수 밖에는 답이 없기 때문이다.

 

 그리고 2023년 현재 자바 환경에서는 이진 바이너리에 관한 툴에서 비트 단위로 무언가를 읽거나 수정하는 기능이 전혀 존재하지 않는다.

 

결국 이 문제를 해결할래면 한번 빙 돌아서 무조건 DataView 기능의 Endianness 옵션을 사용해야만 한다. 해당 문서는 그 디벨롭퍼 모짜렐라의 DataView 문서이다.

 

 dataview의 예를 들어 getuint8()이던 setuint8() 이든, 옵션 변수에 불리언을 추가로 줘서 쓰거나 읽는 방식의 MSB와 :LSB 방향을 결정할 수 있다.

 

 그리고 여담으로 쓰는건데 자바를 접하고 조금씩 느끼다 방금 확신한 사실인데, 프로그래밍 언어가 좀 멍청하다. 뭔가 구조 자체가 무조건 유저의 안전성을 최우선으로 두고 쓰는 사람이 악의적인 행동을 할 것이라고 깔고 시작하니 위 예제도 그렇고, typedarray도 u32int의 경우 오프셋을 무조건 강제로 4바이트 배수로 맞춰야 하고 그렇지 못하면 아예 사용조차 못하는것이 그렇다. 게다가 그 본성이 거의 나무위키급으로 필요한 기능 올리고 투표 승인되서 갖다 붙이는 식이니 대환장파티에 쌓아 올리는 나무성냥집처럼 보인다.