2009-09-23 4 views
2

.Net 응용 프로그램에서 시작하는 문자열이 암호화되어 있으며 AD에 저장되어 있습니다. 그런 다음 네이티브 C++ 응용 프로그램에서 가져 와서 바이트 배열 을 생성하도록 암호가 해독됩니다. 예를 들어 "ABCDEF"가 C++에서 해독되면 004100420043004400,45가됩니다. 종료.MS VC++ 바이트 배열을 BSTR로 변환 하시겠습니까?

이 바이트 배열을 가져 와서 다른 곳에서 사용할 수 있도록 BSTR "ABCDEF"로 변환해야하며이 마지막 단계를 수행 할 방법을 찾을 수 없습니다.

아무도 도와 줄 수 있습니까?

답변

0

"해독 된 문자열"은 유니 코드 문자열로, 라틴 문자는 유니 코드로 표현 될 때 null과 같은 첫 번째 바이트를 포함합니다. 따라서 실제 변환을 필요로하지 않고 버퍼에서 BSTR을 만들면됩니다.

유니 코드 문자의 수를 알고 있으면 버퍼의 길이의 절반이됩니다. SysAllocStringLen()을 호출하면 null로 끝나는 초기화되지 않은 BSTR을 충분히 길게 할당 할 수 있습니다. 그런 다음 memcpy()으로 할당 된 문자열에 배열을 복사하십시오. 또는 SysAllocStringLen()에 전화하여 바이트 버퍼를 전달하여 복사를 수행하고 memcpy()을 건너 뛸 수 있습니다. 더 이상 BSTR이 필요하지 않을 때 SysFreeString()에 전화하는 것을 잊지 마십시오.

+0

왜 초기화되지 않은 문자열을 만든 다음 나중에 문자를 복사합니까? 'SysAllocStringLen'은 당신이 문자를 보내면 문자를 복사합니다. –

+0

나는 캐릭터가 스트리밍 될 수있는 저장 공간에 있다고 가정한다. 이 경우 BSTR에 직접 스트리밍하여 소스 버퍼에 대한 할당을 피할 수 있습니다. 실제로 이것은 특별한 경우에는 중요하지 않습니다. –

+0

@Rob 케네디 : 그렇습니다, 상당히 합리적인 수정입니다. – sharptooth

1

실제로 임의의 바이트 배열이있는 경우 SysAllocStringByteLen을 사용하십시오. 하지만 바이트 배열에도 불구하고 데이터는 실제로 UTF-16 인코딩 된 유니 코드 문자열이므로이 경우에는 SysAllocStringLen을 대신 사용하는 것이 좋습니다. 함수에 바이트 배열 포인터를 넘겨주고 (type-cast를 OLECHAR*으로 설정하십시오), 끝에 새로운 널 문자와 함께 문자가 새로운 문자열에 복사됩니다.

+0

답변 해 주셔서 감사합니다. 나는 이미이 길을 가고 있었고 BSTR에서 끝나는 것은 유효한 유니 코드 문자열이 아닙니다. Whan BSTR을 콘솔에 인쇄하면? (이상하게도 나오는 공백 문자를 제외하고) 뭉치를 얻을 수 있습니다. 올바른 문자는 있지만 올바른 문자는 아닙니다. 콘솔 출력을 망쳐 놨다는 가정하에 BSTR을 테스트 해 보았습니다. BSTR newStr = SysAllocStringLen ((OLECHAR *) decryptedBytes, dataLength/2)을 사용하고 있습니다. 문자열을 만듭니다. decryptedBytes 배열에는 유효한 바이트 스트림 00,41 ... 등이 포함되어 있습니다. – user177656

+1

엔디안 문제 일 수 있습니다. 모든 유니 코드 char 내의 바이트가 서로 바뀌고 다시 바꿔야합니다. – sharptooth

+0

Doh! 고마워, 그게 문제 야. 지금은 잘 작동하고 있습니다 :-) – user177656

관련 문제