2012-06-28 6 views
0

나는 오프셋이있는 구조체와 문자열을 포함하는 이진 데이터 청크를 가지고 있습니다. 는 C++에서이 쉽다 : C#에서 충분히 간단이진 데이터를 문자열로 변환

struct foo 
{ 
int offset; 
char * s; 
} 

void * data; 
... data is read and set 
foo * header = (foo*) data; 
header->s = (int)header-> + (int)data; 
int len = strlen(header->s); 
char* ns = new char[len+1]; 
strcpy(ns,header->s); 

... 이렇게 얼마나? 가장 큰 문제는 문자열의 길이를 알 수 없다는 것입니다. null로 종료됩니다.

나는 byte[]의 데이터와 IntPtr을 메모리에 가지고 있는데 그 데이터에 POINTER가 필요하다. (char *) 문자열의 길이를 얻을 수있는 것이다.

+1

인가 :

는이 일을하는 또 다른 방법은 ASCIIEncoding.ASCII.GetString() 방법을 사용하는 것입니다? 아니면 그냥 임의의 이진 데이터입니까? 암호화 된 데이터 또는 이미지? –

+0

왜 C++ 코드는'std :: string'을 사용하지 않습니까? C 라이브러리와 상호 운용해야합니까? – dan04

+1

dan04, C++은 그가 수행 할 수있는 방법을 보여주는 예제로 게시되었지만 C#에서 완료해야합니다. - 내가 틀렸다면 누군가가 나를 정정하십시오. – hometoast

답변

-1

C#은 고급 언어이며 포인터로 작업하는 것은이 언어에서 단순히 부자연 스럽습니다.

문자열로 바이트 배열에서 데이터를 변환하려면, 당신은 BitConverter 클래스를 사용할 수 있습니다

StringBuilder str = new StringBuilder(); 
// i=starting index of text 
for (int i = 3; i<byte_array.Length; i++) 
    str.Append(byte_array[i]; 

return str.ToString(); 

:

BitConverter.ToInt32(byte_array, start index); 

문자열로 변환하기를, 당신은 StringBuilder 클래스를 사용할 수 있습니다 문자열 뒤에 더 많은 데이터가있는 경우 루프 byte_array[i]!=0의 중지 조건을 넣을 수 있으며 중지하면 byte_array[i]이 문자열 종결 자입니다. i의 값을 저장하면 그 후에 데이터를 가져올 수 있습니다. 이 * 실제로 * 텍스트 데이터

ASCIIEncoding.ASCII.GetString(byte_array, start_index, bytes_count); 
+0

stringbuilder 클래스를 사용할 수 있지만 null 인 지 알기 위해 배열의 각 문자를 반복합니다. asciiencoding에 대해서는 ascii가 아닌 데이터로 작업 할 것인가? 내가 물어 보는 이유는 문자열에 숨겨진 일부 데이터 인코딩이 있다는 것입니다. 즉 char 0x80이 있으면 다음 문자는 특수 처리 된 문자입니다. 그것은 내가 그것을 변경할 수 없도록 사용자 정의 형식 파 파싱입니다. (이전 데이터를 다른 엔디안 시스템으로 이식). – vbbartlett

+0

C++에서 char 형식은 ASCII 문자를 저장하며 다른 인코딩을 지정하지 않았기 때문에 ... 그런 경우 인코딩이 무엇인지 알아야합니다. Encoding 클래스에 ASCII, 유니 코드, UTF32, UTF8, UTF7, BigEndianUnicode에 대한 정적 속성이 있다는 것을 발견했습니다. 그것들 중 하나라면, 모두 GetString() 함수를 가지고 있습니다. – Tibi

+0

@vbbartlett 1. 문자열에 BitConverter를 사용하지 마십시오. 2. 내가 알기에, 적절한 인코딩을 지정할 수있다. (당신의 캐릭터를 지원한다. UTF8은 괜찮을 것이라고 생각한다.) 양쪽 모두 (GetBytes와 GetString)가 같은지 확인한다. 문자열이 byte_array에 저장되는 인코딩 일뿐입니다. – Vlad

관련 문제