Jak zakodować ciąg, zakodowany w ansi c

0

Witam, przenoszę program z c do c# i mam taką oto tablicę zapisaną w języku c

char message[] = {11111101,0,0,0,'D','W','U','G','?'};

Mam teraz funkcję

Byte[] sendBytes = Encoding.ASCII.GetBytes("Is anybody there?");

Lecz chciałym wysłać w niej tablicę zakodowaną w c#, jak zakodować tą pierwszą tablicę

Próbowałem tak wysyłać dane

byte[] sendBytes = { (Byte)253, 0, 0, 0, (Byte)'D', (Byte)'W', (Byte)'U', (Byte)'G'', (Byte)'?' };

Ale to chyba nie tędy droga bo urządzenie do którego wysyłam ciąg bajtów powinno mi odpowiedzieć. Proszę o pomoc

0

Pierwsze rzutowanie na byte nie jest potrzebne. Tablica bajtów w C# wygląda nieco inaczej niż normalna tablica bajtów. W C# to obiekt. Pokaż w jaki sposób wysyłasz do urządzenia.

0

Zerowy bajt to nr komendy, pierwszy, drugi i trzeci bajt mają być puste natomiast od 4 bajtu rozpoczyna się komenda kodowana w ASCII. No i trzeba to wysłać jako strumień bajtów. Znaki komendy bowinny być zakodowane na jednym bajcie ze znaków ascii.

// This constructor arbitrarily assigns the local port number.
            UdpClient udpClient = new UdpClient(12500);
            try
            {
                
                udpClient.Connect(IPAddress.Parse("192.168.2.203"), 12500);
                Console.WriteLine("Ustanowiono połączenie");

                // przekonwertować znaki ascii do byte i wstawić do tablicy
                byte dwiesciepiecdziesiattrzy = Convert.ToByte(253);
                byte zero = Convert.ToByte(null);
                byte M = Convert.ToByte('M');
                byte E = Convert.ToByte('E');
                byte A = Convert.ToByte('A');
                byte S = Convert.ToByte('S');
                byte pytajnik = Convert.ToByte('?');

                //// char[] message = { 253, '0', '0', '0', 'M', 'E', 'A', 'S', '?' };


                byte[] sendBytes = { dwiesciepiecdziesiattrzy, zero, zero, zero, M, E, A, S, pytajnik };

                //Byte[] sendBytes = Encoding.ASCII.GetBytes(message);

                udpClient.Send(sendBytes, sendBytes.Length);
                Console.WriteLine("Wysłano ciag bajtow");
                //IPEndPoint object will allow us to read datagrams sent from any source.
                IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Parse("192.168.2.100"), 12501);

                // Blocks until a message returns on this socket from a remote host.
                Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
                string returnData = Encoding.ASCII.GetString(receiveBytes);

                // Uses the IPEndPoint object to determine which of these two hosts responded.
                Console.WriteLine("This is the message you received " +
                                             returnData.ToString());
                Console.WriteLine("This message was sent from " +
                                            RemoteIpEndPoint.Address.ToString() +
                                            " on their port number " +
                                            RemoteIpEndPoint.Port.ToString());

                udpClient.Close();
                Console.ReadLine();

            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

Myślę że mój problem tkwi jeszcze w tym że funkcja Convert.ToByte(); konwertuje znak unicode na byte zamiast ascii na byte

0

Trochę to przekombinowane. Być może brakuje bajtu zerowego na końcu ciągu. Poza tym kod można trochę uprościć ( wywalić od //prekonwertować znaki ascii[...] do //Byte[] sendBytes[...] )
i wstawić coś takiego:

byte[] sendBytes = new byte[10];
        string text = "MEAS?";
        Encoding.ASCII.GetBytes(text.ToCharArray(), 0, 5, sendBytes, 4);

        sendBytes[0] = 253;
        sendBytes[1] = 0;
        sendBytes[2] = 0;
        sendBytes[3] = 0;

        sendBytes[9] = 0; // NULL BYTE ('\0')


        //wysyłanie dalej tego przez udp.

Spróbuj tak zobaczymy co wyjdzie

0

Niestety nie chodzi mi to, ale polecenie mam takie, że komendy zaczynają się od bajtu 4 i wysyłane są w formacie tekstowym ASCII. Nie wiem czy dobrze rozumiem ale zamiast kodowania na byte po prostu trzeba wysłać ASCII nie wiem jak to zrobić.

0
byte[] sendBytes = new byte[9];

sendBytes[0] = 253; //zerowy bajt - numer komendy
sendBytes[1] = 0; //pierwszy drugi i trzeci są puste
sendBytes[2] = 0;
sendBytes[3] = 0;

//i teraz można na dwa sposoby - tak jak napisał NeuroXig (z wykorzystaniem string i Encoding.ASCII) lub w taki łopatologiczny sposób:
sendBytes[4] = Convert.ToByte('M');
sendBytes[5] = Convert.ToByte('E');
sendBytes[6] = Convert.ToByte('A');
sendBytes[7] = Convert.ToByte('S');
sendBytes[8] = Convert.ToByte('?');

Wszystkie znaki ASCII (standard ASCII 7 bitowy) mają te same kody we wszystkich stronach kodowych, nawet w Unicode. A więc operacja Convert.ToByte('A');

zwróci Ci jeden bajt o wartośc 65 - zgodnie ze standardem ASCII. Gdybyś tam chciał przekonwertować np. polskie znaki to już byłby problem.

Jeśli Ci coś takiego nie działa, to ja bym szukał gdzie indziej przyczyny. Może wysyłasz zły pakiet. Może ma być do tego suma kontrolna. Może urządzenie nie działa poprawnie. Może dane są jakoś źle przesyłane. Jeśli to port COM, to może są złe ustawienia portu (baudrate, bit parzystości itd).

0

Nic z tego, próbowałem tak i tak. Zauważyłem że w C wysyła się znaki char zamiast bajtów może to też być problem

0

Nie. Char w C# to coś innego niż char w C. W C# char to po prostu znak. Domyślnie jako UNICODE i zajmuje dwa bajty. Char w C to po prostu jeden bajt w pamięci. Zatem można powiedzieć, że byte w C# to to samo, co unsigned char w C. sbyte w C# to to samo, co char w C.

Przy okazji: Convert.ToByte('A') da Ci ten sam wynik, co char c = 'A';

0

W takim razie mogę się jeszcze dopatrywać że client udp wysyła jeszcze jakieś dodatkowe bajty oprócz tego co trzeba wysłać w polu danych. Fajnie by było wiedzieć co wysyła. Znalazłem błąd ma być

IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

A ja podałem adres kompa który odbiera Dodam że urządzenie mi mruga po wysłaniu pakietu czyli coś tam dochodzi. Nie wiem jednak czy to to dopiero okaże się jak pójdę sprawdzić do szefa.

0

Jakby była jakakolwiek dokumentacja protokołu lub dokładnie opisany format jak ma wyglądać pakiet to byłoby świetnie.

1

Witam, program jest dobry, to co napisaliście jest ok, tylko problem był w tym że urządzenie pomiarowe wysyłało na pewny adres kompa, niestety adres komputera i pakietu z urządzenia pomiarowego się nie zgadzał i to była przyczyna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1