2009-12-23 7 views
3

나는이 검색을 위해 stackoverflow를 검색 및 검색했지만 필요한 것을 찾지 못했습니다.부호없는 문자 배열로 float vector를 다시 해석하십시오.

나는 부호없는 문자 배열을 매개 변수로 사용하여 Base64로 인코딩하는 루틴을 가지고 있습니다. Base64에서 STL float vector (벡터)를 인코딩하고 싶습니다. 따라서 float 벡터의 바이트를 부호없는 루틴으로 전달하기 위해 부호없는 문자의 배열로 재 해석해야합니다. 재 해석과 정적 캐스팅, mem 복사본 등 여러 가지를 시도했지만, 그 중 아무 것도 작동하지 않는 것 같습니다 (최소한 내가 구현 한 방식이 아닙니다).

마찬가지로 인코딩 된 데이터를 다시 플로트 배열로 디코딩 할 때 반대의 작업을해야합니다. 디코드 루틴은 디코드 된 데이터를 부호없는 char 배열로 제공 할 것이므로이 바이트 배열을 다시 해석하여 float 벡터로 다시 변환해야합니다. 어떤 도움을 크게 감상 할 수

std::string 
EncodeBase64FloatVector(const vector<float>& p_vector) 
{ 
    unsigned char* sourceArray; 

    // SOMEHOW FILL THE sourceArray WITH THE FLOAT VECTOR DATA BITS!! 

    char* target; 
    size_t targetSize = p_vector.size() * sizeof(float); 
    target = new char[ targetSize ]; 

    int result = EncodeBase64(sourceArray, floatArraySizeInUChars, target, targetSize); 

    string returnResult; 
    if(result != -1) 
    { 
    returnResult = target; 
    } 
    delete target; 
    delete sourceArray; 
    return returnResult; 
} 

: 여기

인코딩을하는 내 C++ 코드의 버전을 박탈입니다. 감사.

레이몬드.

+0

빅 엔디안 대 리틀 엔디안에 대한 가정을하고 있습니까? –

+0

@ mmyers : 당연히 그는 있지만 그는 아직 깨닫지 못할 수도 있습니다. 또한 부동 소수점 형식 (IEEE, 아마도)에 대한 가정. 혼합 된 환경에서 고통이되기 때문에 유사한 컴퓨터로 전달되는 데이터에 유용하게 사용되기를 바랍니다. –

+0

예, 지금은 같은 엔디안과 fp 형식을 가정합니다. – Raymond

답변

7

std::vector 데이터가 연속 될 것입니다 보장, 당신은 (비어 아니라 가정)의 첫 번째 요소의 주소를 복용하여 벡터의 첫 번째 요소에 대한 포인터를 얻을 수 있습니다. 이제

typedef unsigned char byte; 
std::vector<float> original_data; 
... 
if (!original_data.empty()) { 
    const float *p_floats = &(original_data[0]); // parens for clarity 

unsigned char의 배열로 그 치료를 위해, 당신은 사용하십시오 reinterpret_cast :

const byte *p_bytes = reinterpret_cast<const byte *>(p_floats); 
    // pass p_bytes to your base-64 encoder 
} 

당신을 위해, 나머지 데이터 이전 벡터의 길이를 인코딩 할 수 있습니다 그것들을 해독하기 쉽게 만들어라.

주의 : 엔디 언과 표현 세부 사항에 대해 계속 걱정해야합니다. 이것은 쓴 플랫폼 (또는 호환되는 플랫폼)을 다시 읽는 경우에만 작동합니다.

5
sourceArray = reinterpret_cast<const unsigned char *>(&(p_vector[0])) 
0

문제를 해결하기 위해 Google's protobuf을 체크 아웃하는 것이 좋습니다. 수레와 복식은 플랫폼 간의 크기와 레이아웃이 다를 수 있으며 그 패키지는 모든 문제를 해결해줍니다. 또한 간단한 플로트 배열보다 복잡해지면 데이터 구조를 쉽게 처리 할 수 ​​있습니다.

사용하는 경우 protobuf가 작업 할 8 비트 클린 채널이 있다고 가정 할 때 데이터를 인코딩하므로 사용자가 직접 base64 인코딩을 수행해야합니다. 그러나 그것은 매우 사소한 것입니다.

관련 문제