내 이전의 question에 이어. C++ 네이티브 관용구를 사용하여 압축/비트 버전으로 문자열을 작성하는 방법이 있습니까? 나는 Perl의 native pack and unpack과 같은 것을 생각하고있다.문자열을 압축하고 풀기위한 C++ 기본 방법
답변
이전 질문을 읽었을 때 "압축 된"출력이 아닌 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();
}
그 밖의 것이 없다면 필자는 항상 펄 헤더와 라이브러리를 폴드 할 수 있다고 생각합니다. 을 참조하십시오.
사실, 저는 libperl ++에 대해이 작업을 수행했습니다. 이미 펄을 포함하고 있지 않다면, 나는 다른 솔루션을 강하게 택할 것이다. –
저는 인라인 :: C 프로그래밍에 대한 배짱이 들어 보았습니다. - 펄의 * C * 부분을 사용하는 것이 얼마나 쉬운지를 느꼈습니다. 해시 및 펄 목록을 추가로 코딩하지 않아도됩니다. 나는 perl 내장으로 주로 C 형 작업을하고있었습니다. – Axeman
- 1. webservice를 통해 객체/문자열을 압축하고 .net compact framework을 사용하십시오.
- 2. C++ 동적으로 문자열을 기본 유형으로 변환합니다.
- 3. iphone 용 zip 폴더의 압축을 풀기위한 zlib
- 4. 문자열을 파일로 읽는 방법 C++
- 5. C++ : RapidXml에서 문자열을 추출하는 방법
- 6. C++에서 문자열을 디코딩하는 방법
- 7. 함수에서 문자열을 반환하는 방법 C
- 8. C++에서 문자열을 인쇄하는 방법
- 9. Objective-C : 문자열을 $로 포맷하는 방법
- 10. 문자열을 변수로 변환하는 방법, vb6/C#/C++?
- 11. 압축 된 문자열을 Java에서 C#으로 전송하는 방법
- 12. C# 코드로 데이터베이스 액세스 2007을 압축하고 수정하는 방법은 무엇입니까?
- 13. C# Windows 서비스 기본 방법
- 14. 문자열을 C++의 템플릿 형식으로 변환하는 방법
- 15. Access 2007 데이터베이스를 자동으로 압축하고 복구하려면 어떻게합니까?
- 16. C# 문자열에서 Null 종료 문자열을 얻는 방법?
- 17. C# Entity Model 연결 문자열을 업데이트하는 방법
- 18. C# : 특정 문화권에서 리소스 문자열을 얻는 방법
- 19. Xcode에서 URL의 문자열을 연결하는 방법 (Objective-c)?
- 20. C++에서 문자열을 datetime으로 변환하는 방법
- 21. C#에서 문자열을 xml로 변환하는 방법
- 22. char 배열에 C++ 문자열을 넣는 방법
- 23. C#에서 SOAPMessage로 문자열을 변환하는 방법
- 24. 하위 문자열을 사용하여 문자열을 분할하는 방법
- 25. 문자열을 배열로 나누는 방법
- 26. 이미지를 압축하고 다른 유형으로 변경 가능합니까?
- 27. 자바에서 문자열을 처리하는 방법
- 28. 문자열을 ifstream으로 변환하는 방법
- 29. 엔터티 프레임 워크에서 기본 키로 문자열을 만드는 방법!
- 30. C 또는 C++. char * 포인터가 주어진 두 문자열을 비교하는 방법?
실제로 TO TOO 목록에 있지만 아직 작성하지 않았습니다. 팩은 형식 안전 방식으로 작성하는 것이 쉬워야합니다 (직렬화가 실제로 어렵지는 않음). 아직 완성되지 않은 다른 손으로 풀기. –
플랫폼과 문자열에 대한 정확한 인코딩에 대한 자세한 정보를 제공해야한다고 생각합니다. Packis는 매우 유연합니다. – weismat
이 기능을 수행하기 위해 Google 코드에있는 작은 라이브러리를 작성했습니다 : code.google.com/p/packlib/ – Bluefalcon