2013-11-26 1 views
0

일부 하드웨어 통신 코드를 VB6에서 C#으로 변환하고 있으며 장치에 문자를 보내야하는 som 통신에 문제가 있습니다. VB6 코드는 다음과 같습니다VB6에서 Chr을 C#으로 번역했습니다.

Dim STARTQUEST As String 
STARTQUEST = Chr(254) + Chr(address + 8) + Chr(address) + Chr(20) + Chr(128) + Chr(3) 

그리고 나는이 C# 코드

String m_startQuest = ""; 
m_startQuest = m_startQuest + (Char)254 + (Char)(address + 8) + (Char)address + (Char)20 + (Char)128 + (Char)3; 

했을하지만 나는 그들로부터 동일한 출력을하지 않는 느낌을 얻을. atleast 디버그에서 STARTQUEST 문자열이 많이 달라 보입니다. 다른 방법으로 vb6 함수를 C#에서 동일하게 처리 할 수 ​​있습니까?

+0

문자열 코드 대신 'byte []'를 사용해야합니다. –

+0

C#과 VB6 사이에 'byte []'를 사용하는 이유가 무엇입니까? 내가 아는 VB6 코드가 작동하고 있기 때문에 – Nick3

답변

2

하나의 옵션 (링크 참조) Microsoft.VisualBasic에 대한 참조를 추가하고

Chr 당신이 생각하는 것보다 무대 뒤에서 더 많이하고있는 Strings.Chr 기능을 사용하는 것입니다.

+0

나는 이것을 좋아한다. 이것이 가능성이 있는지 몰랐습니다! – Nick3

+1

수정 된 게시물. 문자열이어야합니다 .Chr String.Chr 없습니다. – user2942249

+0

그래, 주목! – Nick3

1
m_startQuest += Encoding.ASCII.GetString(
    new byte[] {254, address + 8, address, 28, 128, 3} 
); 

왜 바이트입니까? .Net char 유형은 유니 코드를 지원하며 255보다 클 수 있습니다. 따라서 바이트를 사용하는 것이 더 안전합니다.

업데이트 :

런타임 오류

Dim s As String 
s = Chr(1) + Chr(256) 
Debug.Print s 

결과는 C#에서 257입니다 VB6

있다.

(((char)1) + ((char)256)) 

결과는 C#의 문자열입니다.

(((char)1) + "" + ((char)256)) 

는 C#에서 시간 오류를 컴파일합니다. 제 (샤아) 캐스트를 사용 는

Encoding.ASCII.GetString(
    new byte[] { 1, 256 } 
); 
+0

좋아,이 코드는 내 원래 코드와 같은 결과를 얻지 만, 나는 더 좋은 부분을 좋아한다! C# 문자열과 vb6 문자열이 다르게 보일 수있는 "표시 오류"가있을 가능성이 있습니까? – Nick3

0

당신에게 VB6의 CHRW (안 대하) 함수의 동작을 가져옵니다. VB6의 Chr 함수는 ANSI < -> 유니 코드 변환을 사용하여 C#에서 이것을 복제하기 위해 System.Text.Encoding.Default.GetBytes()를 사용할 수 있습니다.