2009-03-26 3 views
2

내 이전의 question에 이어. C++ 네이티브 관용구를 사용하여 압축/비트 버전으로 문자열을 작성하는 방법이 있습니까? 나는 Perl의 native pack and unpack과 같은 것을 생각하고있다.문자열을 압축하고 풀기위한 C++ 기본 방법

+0

실제로 TO TOO 목록에 있지만 아직 작성하지 않았습니다. 팩은 형식 안전 방식으로 작성하는 것이 쉬워야합니다 (직렬화가 실제로 어렵지는 않음). 아직 완성되지 않은 다른 손으로 풀기. –

+0

플랫폼과 문자열에 대한 정확한 인코딩에 대한 자세한 정보를 제공해야한다고 생각합니다. Packis는 매우 유연합니다. – weismat

+0

이 기능을 수행하기 위해 Google 코드에있는 작은 라이브러리를 작성했습니다 : code.google.com/p/packlib/ – Bluefalcon

답변

2

이전 질문을 읽었을 때 "압축 된"출력이 아닌 2 진 인코딩 된 출력을 원한다고 생각하는 것 같습니다. 일반적으로 "압축 된"은 LZW 인코딩과 같은 알고리즘의 적용을 통해 크기가 축소 된 데이터를 구체적으로 나타 내기 위해 사용됩니다. 귀하의 경우, 다양한 숫자의 경우 이진 표현이 ASCII 표현보다 더 효율적이기 때문에 출력이 더 작다는 의미에서 "압축"되어있을 수 있지만 표준 감각에서는 "압축"이 아닙니다 이는 귀하가 찾고있는 대답을 얻는 데 어려움을 겪고있는 이유 일 수 있습니다.

나는 당신이 정말로 요구하는 생각 다음

(예를 들어, 표준 : : 문자열에 저장) ASCII 형식의 수를 감안할 때, 내가 바이너리 인코딩 정수로 파일이 쓰기 방법 ?

답변에는 두 부분이 있습니다. 먼저 ASCII로 인코딩 된 문자열을 정수 값으로 변환해야합니다. strtol과 같은 함수를 사용할 수 있습니다. strtol은 ASCII 인코딩 된 숫자에 해당하는 긴 정수를 반환합니다. 긴 정수로 표현 될 수있는 숫자의 크기에는 제한이 있으므로 숫자가 매우 크면 번역 할 때 더 창의적이어야합니다.

두 번째로, ostream :: write()를 사용하여 출력 스트림에 데이터를 작성해야합니다. ostream :: write()는 사용자가 지정한 바이트의 형식을 지정하지 않습니다. 기본값 연산자 < <()을 사용하여 값을 쓰면 숫자가 ASCII로 다시 변환되고 그 식으로 쓰여지는 것을 알 수 있습니다. 이 모든 것을 다음과 같이 정리하십시오.

#include <stdlib.h>  // For strtol(). 
#include <arpa/inet.h>  // For htonl(). 
#include <fstream>   // For fstream. 
#include <string>   // For string. 

int main(int argc, char *argv[]) { 
    char *dummy = 0; 
    std::string value("12345"); 

    // Use strtol to convert to an int; "10" here means the string is 
    // in decimal, as opposed to, eg, hexadecimal or octol, etc. 

    long intValue = strtol(value.c_str(), &dummy, 10); 

    // Convert the value to "network order"; not strictly necessary, 
    // but it is good hygiene. Note that if you do this, you will 
    // have to convert back to "host order" with ntohl() when you read 
    // the data back. 

    uint32_t netValue = htonl(intValue); 

    // Create an output stream; make sure to open the file in binary mode. 

    std::fstream output; 
    output.open("out.dat", std::fstream::out | std::fstream::binary); 

    // Write out the data using fstream::write(), not operator<<()! 

    output.write(reinterpret_cast<char *>(&netValue), sizeof(netValue)); 
    output.close(); 
} 
2

그 밖의 것이 없다면 필자는 항상 펄 헤더와 라이브러리를 폴드 할 수 있다고 생각합니다. 을 참조하십시오.

+0

사실, 저는 libperl ++에 대해이 작업을 수행했습니다. 이미 펄을 포함하고 있지 않다면, 나는 다른 솔루션을 강하게 택할 것이다. –

+0

저는 인라인 :: C 프로그래밍에 대한 배짱이 들어 보았습니다. - 펄의 * C * 부분을 사용하는 것이 얼마나 쉬운지를 느꼈습니다. 해시 및 펄 목록을 추가로 코딩하지 않아도됩니다. 나는 perl 내장으로 주로 C 형 작업을하고있었습니다. – Axeman

관련 문제