2009-07-27 6 views
2

텍스트 데이터로 작업 할 때 훌륭한 FileHelpers 라이브러리를 사용합니다. 이를 통해 파일 또는 메모리 내 문자열의 텍스트 필드를 데이터를 나타내는 클래스로 매우 쉽게 덤프 할 수 있습니다.바이너리 데이터 용 파일 가져 오기/내보내기 유틸리티 인 FileHelpers와 비슷합니까?

빅 엔디안 마이크로 컨트롤러 기반 시스템으로 작업 할 때 직렬 데이터 스트림을 읽어야합니다. 매우 제한된 마이크로 컨트롤러 플랫폼에서 공간을 절약하기 위해 다양한 멀티 바이트 유형의 필드를 포함하는 원시 바이너리 데이터를 작성해야합니다. 기본적으로 직렬 포트에서 구조체 변수를 덤프하는 것입니다.

저는 FileHelpers의 아키텍처를 좋아합니다. 데이터를 나타내는 클래스를 만들고 클래스에 데이터를 입력하는 방법을 엔진에 알려주는 속성으로 태그를 지정합니다. 엔진에 단일 레코드를 나타내는 문자열을 제공하고 데이터의 비 직렬화 표현을 얻을 수 있습니다. 그러나 이것은 원시 데이터가 어떤 식 으로든 구분되지 않는다는 점에서 오브젝트 직렬화와 다르며 간단한 2 진 고정 레코드 형식입니다.

FileHelpers는 아마 내가 유니 코드 문제가있을 수 있다는 의심 * 표시 및 널 (null)을 처리 할 수 ​​ 등의 바이너리 데이터를 읽기에 적합하지 않습니다 (엔진은 문자열로 입력을 받아, 그래서 바이트를 읽을 필요 직렬 포트에서 데이터 변환기 클래스로 이동하기 전에 유니 코드 문자열로 변환하십시오. 실험으로 나는 이진 스트림과 을 읽도록 설정 했으므로 null을 보내지 않도록주의해야합니다. 그것은 지금까지 꽤 잘 작동합니다. 원시 데이터를 읽고 엔디안 포팅 문제 등을 설명하는 새로운 변환기를 쉽게 설정할 수 있습니다. 현재 은 null에서 실패하고 은 여러 레코드를 처리 할 수 ​​없습니다 (레코드 사이에 CRLF가 필요함).

내가 알고 싶은 것은 누군가 FileHelpers와 유사하게 작동하지만 오픈 소스 라이브러리가 바이너리 데이터를 처리하도록 설계되었다는 것을 아는 것이다.

이 작업을 처리하기 위해 FileHelpers에서 파생되는 것을 고려하고 있지만 이미이 작업을 수행 할 수있는 무언가가 있어야하는 것처럼 보입니다.

* 입력 스트림에서 null에 대해 불평하지 않는 것으로 나타났습니다. 내 테스트 프로그램에서 널 (null)에 대한 문제점이 예상되는 곳과 관련이없는 버그가있었습니다. 먼저 조금 더 깊이 조사 했어야 했어!

답변

0

필자는 filehelpers를 사용하지 않았으므로 직접 비교할 수 없습니다. 그러나 객체를 나타내는 객체 모델이 있다면 protobuf-net; 그것은 구글의 컴팩트 한 "프로토콜 버퍼"와이어 포맷을 사용하는 .NET 용 바이너리 직렬화 엔진이다. XML과 같은 것보다 훨씬 효율적이지만 모든 직렬화 코드를 작성할 필요가 없습니다.

"프로토콜 버퍼"에 필드 사이에 매우 간결한 마커가 포함됩니다 (일반적으로 1 바이트). 이 경우 약간의 패딩이 추가되지만 버전 허용 오차가 크게 향상됩니다. "포장 된"데이터 (즉, int의 블록, 예를 들어 배열로부터)의 경우, 이것은 원한다면 생략 될 수 있습니다.

그래서 압축 출력 만 원한다면 좋을 것입니다. 특정 출력이 필요하다면 아마 그럴 것입니다.

공개 사항 : 저는 저자이기 때문에 편견이 있습니다. 하지만 그것은 무료입니다.

+0

매우 가벼운 데이터를 생성하는 코드라면 이상적인 해결책이 될 수 있습니다. 저는 몇 킬로바이트의 스토리지 만 갖춘 AVR 마이크로 컨트롤러 기반 플랫폼 인 Arduino와 함께 작업하므로 공간이 주요 관심사입니다. 현재 포맷팅없이 직렬 포트 밖으로 구조체를 덤핑하는 중이므로 오버 헤드가 최소화됩니다. C++ 프로토콜 버퍼 라이브러리가 크고 8 비트 환경으로 컴파일 할 수 있다면 어떤 아이디어가 필요할까요? – DaveK

+0

지금은 공간 제한 시나리오에서 C 버전을 사용하는 것이 좋지만 새로운 슬림형 버전이 출시 될 것이라고 생각합니다. http://groups.google.com/group/protobuf/browse_thread/thread/5520b05194d73d76# . 그래도 여전히 너무 클 수 있습니다. 나는 정직하게 모른다. 그리고 8 비트는 ... 도전 중입니다. 불행히도 "아니오"라고 생각합니다. 죄송합니다. –

0

GPS 데이터를 SIRFstarIII 바이너리 모드로 조작하고있을 때 직렬 포트와 함께 Python 대화식 프롬프트를 사용하여 USB/직렬 포트에서 스트림을 가져오고 struct module을 사용하여 바이트를 필요한대로 변환합니다 SIRF에 의해 정의 됨).문자열을 변수로 읽어서 처리하고, 결과를보고 필요할 경우 다시 시도 할 수 있기 때문에 대화식 프롬프트를 사용하는 것은 매우 유연합니다. 프로토 타이핑 단계가 끝나면 최종 프로그램에 넣어야하는 데이터 형식 문자열이 있습니다.

귀하의 질문에 C# 태그가있는 이유에 대해 언급하지 않았습니다. 나는 FileHelpers가 C# 라이브러리라는 것을 이해하지만, 나는 당신이 일하고있는 환경을 말해주지 않는다. IronPython이라는 Python for .NET의 구현이있다.

나는이 대답이 새로운 언어를 배워야한다는 것을 의미 할 수도 있지만 대화식 프롬프트를 갖는 것은 모든 프로그래머에게 매우 강력한 도구입니다.