2016-12-19 6 views
3

현재 작업중인 소프트웨어가 있는데, 이는 현재 little-endian 아키텍처에서 실행됩니다. 나는 그것도 big-endian 모드에서 실행하고 싶습니다. 기본 시스템의 endianness에 관계없이 little-endian 데이터를 파일에 쓰고 싶습니다.리틀 엔디안과 빅 엔디안 플로트를 효과적으로 변환합니다.

이것을 달성하기 위해 나는 boost 엔디안 라이브러리를 사용하기로 결정했습니다. 그것은 정수를 효율적으로 변환 할 수 있습니다. 그러나 수레 (및 복식)는 처리 할 수 ​​없습니다.

documentation에는 "부동 소수점 유형이 Boost 1.59.0에서 지원됩니다"라고 나와 있습니다. 그러나 그들은 여전히 ​​1.62에서 지원되지 않습니다.

플로트는 유효 IEEE 754 수레 (또는 복식)라고 가정 할 수 있습니다. 그러나 그들의 endianness는 기본 시스템에 따라 다를 수 있습니다. 내가 아는 한, 부동 소수점에 htonlntohl 함수를 사용하는 것은 좋지 않습니다. 그러면 어떻게 될 수 있습니까? 거기에 수레를 처리 할 수있는 모든 헤더 전용 라이브러리가 있습니까? 나는 아무 것도 찾을 수 없었다.

나는, 나는 여러 가지 이유로, 그 방법을 피하고자하는 문자열로 수레를 변환하고, 파일에 그것을 쓸 수 (성능, 디스크 공간, ...) 여기

+0

lib가 필요하지 않으며, 즉각적입니다. 거기보세요 : http://stackoverflow.com/questions/2782725/converting-float-values-from-big-endian-to-little-endian – aCOSwt

답변

0

:

float f = 1.2f; 
auto it = reinterpret_cast<uint8_t*>(&f); 
std::reverse(it, it + sizeof(f)); //f is now in the reversed endianness 

아무 것도 필요하지 않습니다.

0

Unheilig : u는 즉시 반전, 사용, 포인터를 사용할 때 당신이 올바른지,하지만

#include <boost/endian/conversion.hpp> 


template <typename T> 
inline T endian_cast(const T & t) 
{ 
#ifdef BOOST_LITTLE_ENDIAN 
    return boost::endian::endian_reverse(t); 
#else 
    return t; 
#endif 
} 

나 : (아니면 수동으로

template <typename T> 
inline T endian_cast(T *t) 
{ 
#ifdef BOOST_LITTLE_ENDIAN 
    return boost::endian::endian_reverse_inplace(*t); 
#else 
    return t; 
#endif 
} 

그것을 사용하는 대신 오류 -) 경향이 반전은 내용의

예 :

std::uint16_t start_address() const 
{ 
    std::uint16_t address; 
    std::memcpy(&address, &data()[1], 2); 
    return endian_cast(address); 
} 
void start_address(std::uint16_t i) 
{ 
    endian_cast(&i); 
    std::memcpy(&data()[1], &i, 2); 
} 

행운을 비네.