>source

작은 엔디안 형식의 파일에서 한 번에 8 비트를 읽고 싶습니다. CPU도 리틀 엔디안 인 것 같아서 엔디안에 대해 걱정할 필요가 없습니다.

내가 읽는 것은 RAW12 파일의 RGGB CFA의 숫자, 강도 값입니다.

내 코드는-

 uint8_t first8bits, second8bits, third8bits;
  file.read((char*)&first8bits, sizeof(uint8_t));
  file.read((char*)&second8bits, sizeof(uint8_t));
  file.read((char*)&third8bits, sizeof(uint8_t));
  Red_channel = (first8bits) << 4 | (second8bits & 0xF0) >> 4;
  Green_channel = (second8bits & 0x0F) | (third8bits);

다른 사람들이 그것을 8 비트를 char 배열로 읽은 다음 숫자로 변환하는 것을 보았습니다. 어떻게합니까? 내가 코드를 테스트하는 기계는 리틀 엔디안이기 때문에 바이트 스왑을 수행 할 필요가 없다고 생각하지만 다른 사람이 빅 엔디 언 컴퓨터 에서이 코드를 테스트하는 경우 런타임에 머신이 리틀 엔디안 또는 빅 엔디안이면 어떻게 찾을 수 있습니까? ?

도움을 주시면 감사하겠습니다.


  • 답변 # 1

    posix 플랫폼을 사용하는 경우 <endian.h> 가있을 수 있습니다.

    그 기능들과 함께 http://man7.org/linux/man-pages/man3/htole32.3.html 매크로 정의 제공 : __LITTLE_ENDIAN   __BIG_ENDIAN __BYTE_ORDER  (glib/types.h 또는 bits/types.h에 포함되어 있음)

    전처리기를 사용할 수 있습니다

    #if __BYTE_ORDER == __LITTLE_ENDIAN
    
    

    필요한 경우 하나 이상의 작업을 발생시키는 템플릿 또는 유형을 정의합니다. 엔디안은 a) 바이트 순서 b) 구조체의 비트 필드 순서를 감시해야 함을 의미합니다. 빅 엔디안은 "네트워크"바이트 순서와 일치하지만 비트 필드의 경우 리틀 엔디안 플랫폼에서 첫 번째로 정의 된 필드는 가장 중요하지 않으며 빅 엔디안에서는 가장 중요합니다. 기술적으로는 표준으로 정의되어 있지 않지만이 순서는 Linux 및 기타 OS의 커널 코드에 의해 "정식화"됩니다.

    Windows를 사용하는 경우 리틀 엔디안 플랫폼을 사용합니다. CPU가 실제로 엔디안을 어느 정도 전환 할 수 있기 때문에 ARM 및 MIPS에서는 상황이 더 복잡합니다. 이것이 그러한 라이브러리 함수가 존재하는 이유입니다.

    비트 시프트 연산은 순서를 무시할 수 있으며 비트 시프트 연산이 피연산자를 자동으로 int 로 승격 시킨다는 것을 명심할 경우 사용될 수 있습니다 .

  • 답변 # 2

    내가 사용한 코드가 정확합니다. 다른 방법은

    char inBuf [3];
    intputfile.read(inBuf, 3);
    cfa[i][cnt] = ((uint8_t)inBuf[0]) << 4 | ((uint8_t)inBuf[1] & 0xF0) >> 4;
    cfa[i][cnt+1] = ((uint8_t)inBuf[1] & 0x0F) << 8 | ((uint8_t)inBuf[2]);
    
    

  • 이전 xml - XSLT의 텍스트 (요소 속성)를 한 줄로 포맷하는 방법
  • 다음 pandas - Python의 여러 조건에 따라 여러 데이터 프레임에서 다른 데이터 프레임으로 하나의 열 병합