Avatar billede fiskerendk Nybegynder
09. februar 2013 - 03:25 Der er 6 kommentarer og
1 løsning

ASCII til Byte variabel

Hej,

Jeg er ved at lave et program som skal sende nogle kommando'er ud på en serielPort men jeg er kommet til et lille stop og jeg håber nogen her kan hjælpe mig ud af denne krise :)

Jeg har lavet en application der modtager et TcpStream fra enten et website og/eller det klient app jeg har lavet.

Jeg sender til server delen følgende f.eks. 1E:04:00:D2:00:01:93:9C, (som i dette tilfælde er den Hex/byte kode som skal sendes over serialPorten). Problemet er hvis jeg blot tager ovenstående (som er ASCII) og fjerner ":" og sender det på serialporten så får jeg jo denne text sendt som ascii og derfor ikke som byte/hex som jeg gerne vil.

Mit spørgsmål er derfor hvordan får jeg lavet en variabel(String) om fra ASCII til følgende en Byte og stadig bibeholder tegnene.

Det virker jo f.eks. hvis jeg hardkoder følgende:
Dim Buffer() As Byte = {}
Buffer = {&H1E, &H04, &H00, &HD2, &H00, &H01, &H93, &H9C}
SerialPort.Write(Buffer, 0, 8)

Men jeg kan ikke få lov til blot at smide en string variabel ind istedet for 1E eller 04, osv.  (f.eks. {&Harray(1)) det virker jo ikke. Nogen der har en god ide?

Mvh
Thomas Nissen
Avatar billede arne_v Ekspert
09. februar 2013 - 03:45 #1
Den primitive loesning maa vaere:

using System;
using System.Globalization;

namespace E
{
    public class Program
    {
        public static byte[] FromHex(string s)
        {
            byte[] ba = new byte[(s.Length+1)/3];
            for(int i = 0; i < ba.Length; i++)
            {
                ba[i] = byte.Parse(s.Substring(3 * i, 2), NumberStyles.HexNumber);
            }
            return ba;
        }
        public static void Main(string[] args)
        {
            string s = "1E:04:00:D2:00:01:93:9C";
            byte[] ba = FromHex(s);
            foreach(byte b1 in ba)
            {
                Console.WriteLine(b1);
            }
            Console.ReadKey();
        }
    }
}
Avatar billede RogerWilco Seniormester
09. februar 2013 - 10:06 #2
Jeg bruger ikke VB.NET, men i VBScript ville jeg først bruge Split-funktionen til at dele strengen op i elementer, og dernæst konvertere hvert element fra hex med funktionen CInt:

dim buffer(7)
a=split("1E:04:00:D2:00:01:93:9C",":")
for i=0 to ubound(a)
  buffer(i)=cint("&H" & a(i))
  next
Avatar billede fiskerendk Nybegynder
09. februar 2013 - 12:17 #3
Jeg har prøvet følgende i koden, ment tilsyneladende stopper koden for resten af det virker ikke, men jeg for dog ingen fejl i programmet.

Dim arrTcpReceived() As String = EnvTcpReceived.Split(":")
Dim Buffer() As Byte = {}
Dim i As Integer

For i = 0 To UBound(arrTcpReceived)
Buffer(i) = CInt("&H" & arrTcpReceived(i))
Next
SerialPort1.Write(Buffer, 0, i)
Avatar billede fiskerendk Nybegynder
09. februar 2013 - 16:15 #4
Jeg tror jeg sammen med jer fik det løst:
Følgende har jeg lavet og ser ud til at virke, jeg giver lige point senere til jer begge som tak for hjælpen. Nogengange for man stirret sig rigtig blind på nogle ting.

            Dim EnvTcpReceived = "1E:00:00:00:00:00"
            Dim i As Integer
            Dim strHex As String = EnvTcpReceived
            Dim byteHex As Byte() = New Byte((strHex.Length + 1) \ 3 - 1) {}

            For i = 0 To byteHex.Length - 1
                byteHex(i) = Byte.Parse(strHex.Substring(3 * i, 2), Globalization.NumberStyles.HexNumber)
            Next

Som en sidegevindst er det så muligt at få en hurtig forklaring på strHex.Length + 1 \ 3 -1 halløj bare lige så jeg forstår det bedre. mange tak.
Avatar billede arne_v Ekspert
09. februar 2013 - 16:51 #5
(strHex.Length + 1) \ 3

er antallet af bytes

XX:XX:XX

+1 for det manglende kolon til sidste

\3 fordi XX: bliver til Y
Avatar billede fiskerendk Nybegynder
09. februar 2013 - 23:33 #6
Smid nogle svar så i kan få nogle points :)
Avatar billede fiskerendk Nybegynder
16. november 2013 - 13:50 #7
Da arne og roger ikke fik svaret så svarer jeg selv for at lukke den. Men tak til jer begge. Nu er indlægget ved at være lidt gammelt :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester