2012-12-01 5 views
0

c를 안녕 내가 C 번호의 클라이언트 응용 프로그램을 개발하고있어 서버가 C++로 작성INT는 [] 문자열 #

서버가 사용

inline void StrToInts(int *pInts, int Num, const char *pStr) 
{ 
    int Index = 0; 
    while(Num) 
    { 
    char aBuf[4] = {0,0,0,0}; 
    for(int c = 0; c < 4 && pStr[Index]; c++, Index++) 
     aBuf[c] = pStr[Index]; 
    *pInts = ((aBuf[0]+128)<<24)|((aBuf[1]+128)<<16)|((aBuf[2]+128)<<8)|(aBuf[3]+128); 
    pInts++; 
    Num--; 
    } 

    // null terminate 
    pInts[-1] &= 0xffffff00; 
} 

은 []

int로하는 문자열로 변환 내 C# 클라이언트에서

는 내가받을 :

int[4] { -14240, -12938, -16988, -8832 } 

는 어떻게 문자열로 다시 배열을 변환합니까? 안전하지 않은 코드 (예 : 포인터)를 사용하고 싶지 않습니다. 내 시도로 인해 읽을 수없는 문자열이 생성되었습니다.

편집 : 여기 내 approch 중 하나입니다 : 내가 엔디안의 돌볼 필요하지만 서버로 내 로컬 컴퓨터와 너무 서버에서 실행되는 알고

private string IntsToString(int[] ints) 
{ 
    StringBuilder s = new StringBuilder(); 
    for (int i = 0; i < ints.Length; i++) 
    { 
    byte[] bytes = BitConverter.GetBytes(ints[i]); 
    for (int j = 0; j < bytes.Length; j++) 
     s.Append((char)(bytes[j] & 0x7F)); 
    } 
    return s.ToString(); 
} 

, 나는이 있다고 가정 문제가 아니다.
또 다른 시도는 명시 적 레이아웃과 정수 및 문자에 대해 동일한 FieldOffset과 함께 구조체를 사용하는 것이지만 작동하지 않습니다. 당신은 쉼표로 구분 된 문자열이 방법을 만들 수 있습니다

+2

결과 문자열은 어떻게 표시되어야합니까? –

+1

지금까지 시도한 것은 무엇입니까? 코드를 공유하십시오. 이미 비트가 모두 바뀌는 것을 기대하고 있습니다. – sll

+0

문자열 또는 단일 문자열 (csv) 배열을 반환 하시겠습니까? –

답변

1

아마 (LINQ 사용)과 같은 시도 :

int[] fromServer = { -14240, -12938, -16988, -8832, }; 

string reconstructedStr = new string(fromServer.SelectMany(BitConverter.GetBytes).Select(b => (char)(b - 128)).ToArray()); 

테스트되지 않은,하지만부터 시작하는 뭔가가있다. 128의 뺄셈이 정확한지 모르겠다.

+0

"￶ H￶M $ = \ 0]"을 반환합니다. 이상한 :) NUL을 가지고 있다면 일종의 멈출 필요가 있다고 생각한다. (문자열의 끝 때문에) –

+0

@RobinWebdev 다른 문자열을 기대 했습니까? 어느 것? 내 접근 방식이''\ 0 ''문자 다음에 끝나지 않는다. 어쩌면'char'의 순서가 제 버전에서도 올바르지 않을 지 모르지만 문자는 원하는 것과 같아야합니까? 첫 번째''\ 0 ''과 그 이후의 모든 것을 지우고 싶다면''\ 0 ''이 없으면 실패 할 것입니다 ('reconstructedStr = reconstructedStr.Remove (reconstructedStr.IndexOf ('\ 0'));' 거기에있다). –

+0

문자열이 화면에 그려지기 때문에 더 쉽게 읽을 수 있습니다. Hmpf ... –

1

은 :

string str = String.Join(", ", intArray.Select(x => x.ToString()).ToArray()); 
+0

감사하지만 서버 측에 존재하는 문자열이 필요합니다. 이 작업은 포인터가없는 C++ 함수를 역순으로 수행하는 것입니다 –

+0

숙제입니까? – Borgleader

+0

아니요 몇 년 전에 학교를 떠났습니다 :) ^^ –

0
var ints = new[] {-14240, -12938, -16988, -8832}; 
    var result = string.Join("-", ints.Select(i => BitConverter.ToString(BitConverter.GetBytes(i)))); 
    Console.WriteLine(result); //60-C8-FF-FF-76-CD-FF-FF-A4-BD-FF-FF-80-DD-FF-FF 

BitConverter.ToString는 나중에 문자열을 구문 분석하는 방법에 따라 다른 여기에 무언가로 대체 될 수있다.

+0

나쁘지는 않지만 + C++ 코드에서 128. 제 의견으로는 변환하는 동안 비트를 설정 해제해야하므로 모든 바이트의 마지막 비트를 설정합니까? 이렇게하면 각 바이트가 인쇄 가능한 ASCII 문자를 나타냅니다. 내가 잘못하면 나를 바로 잡아주세요. –