Avatar billede jonbdk Nybegynder
01. november 2004 - 15:23 Der er 25 kommentarer og
1 løsning

Konvertering af PDU til TEKST for brug ved sms afsendelse med GSM

Iflg. aftale med arne_v
Avatar billede arne_v Ekspert
01. november 2004 - 16:33 #1
Andre måtte da også gerne forsøge sig.
Avatar billede arne_v Ekspert
01. november 2004 - 16:33 #2
Men her er mit forslag:

using System;
using System.Text;

public class BitFun
{
    private static void From8To7(byte[] b, ref int boffset, byte[] res, ref int resoffset)
    {
        long temp = 0;
        int blen = Math.Min(b.Length - boffset, 8);
        for(int i = 0; i < blen; i++)
        {
            temp |= (((long)b[boffset + i]) << (i * 7));
        }
        boffset += blen;
        int reslen = (blen*7+7)/8;
        for(int j = 0; j < reslen; j++)
        {
            res[resoffset + j] = (byte)((temp >> (j * 8))& 0xFF);
        }
        resoffset += reslen;
    }
    private static void From7To8(byte[] b, ref int boffset, byte[] res, ref int resoffset)
    {
        long temp = 0;
        int blen = Math.Min(b.Length - boffset, 7);
        for(int i = 0; i < blen; i++)
        {
            temp |= (((long)b[boffset + i]) << (i * 8));
        }
        boffset += blen;
        int reslen = (blen*8+6)/7;
        for(int j = 0; j < reslen; j++)
        {
            res[resoffset + j] = (byte)((temp >> (j * 7))& 0xFF);
        }
        resoffset += reslen;
    }
    public static byte[] Encode(string s)
    {
        byte[] b = Encoding.ASCII.GetBytes(s);
        int boffset = 0;
        byte[] res = new byte[(b.Length*7+7)/8];
        int resoffset = 0;
        while(boffset < b.Length)
        {
            From8To7(b, ref boffset, res, ref resoffset);
        }
        return res;
    }
    public static string Decode(byte[] b)
    {
        int boffset = 0;
        byte[] res = new byte[(b.Length*8+6)/7];
        int resoffset = 0;
        while(boffset < b.Length)
        {
            From7To8(b, ref boffset, res, ref resoffset);
        }
        int n = resoffset;
        while((n > 0) && (res[n-1] == 0)) n--;
        return Encoding.ASCII.GetString(res, 0, n);
    }
    public static void Main(string[] args)
    {
        byte[] data = Encode("hellohello");
        for(int k = 0; k < data.Length; k++)
        {
            Console.Write(String.Format("{0:X2} ",data[k]));
        }
        Console.WriteLine();
        Console.WriteLine(Decode(data));
    }
}
Avatar billede lmdthel Nybegynder
02. november 2004 - 17:46 #3
Det er cool , kun en lille bug , den kapper lidt af sætningen. feks bliver:

"det her er sku sejt lavet af arne" til "det her er sku sejt lavet af"
Avatar billede arne_v Ekspert
02. november 2004 - 18:01 #4
Det kigger jeg lige på.
Avatar billede arne_v Ekspert
02. november 2004 - 18:06 #5
Hm.

Jeg kan ikke genskabe problemet.

Kan du poste den kode som viser problemet ?
Avatar billede lmdthel Nybegynder
02. november 2004 - 18:12 #6
Damn jeg var nok lidt hurtig..

Det ser ud som du gør det korrekt , det er i sms'en jeg modtager det mangler, så den ligger hos mig.
Avatar billede arne_v Ekspert
02. november 2004 - 18:51 #7
OK

Noget jeg kan hjælpe med ?
Avatar billede arne_v Ekspert
02. november 2004 - 18:51 #8
Og et svar
Avatar billede lmdthel Nybegynder
02. november 2004 - 18:57 #9
nææ ikke umiddelbart

Du skulle vel aldrig mangle et job??
Avatar billede arne_v Ekspert
02. november 2004 - 18:58 #10
Jeg har et !

:-)
Avatar billede lmdthel Nybegynder
02. november 2004 - 19:01 #11
jaa det tænkte jeg nok..

:-)
Avatar billede jonbdk Nybegynder
02. november 2004 - 21:04 #12
Hej Arne
Nu har jeg endelig fået tid - sry det varede så længe
Jeg kan ikke helt få det til at virke... Når jeg kører den, får jeg outputtet:
E8 32 9B FD 46 97 D9 EC 37
?el?o?el?o
Avatar billede lmdthel Nybegynder
02. november 2004 - 21:10 #13
Det kører fint her hos mig (lmdthel)..

E8 32 9B FD 46 97 D9 EC 37
hellohello
Avatar billede jonbdk Nybegynder
02. november 2004 - 21:12 #14
hmmm og du har bare taget ovenstående kode og kompileret? Eller har du brugt den sammen med noget andet?
Avatar billede lmdthel Nybegynder
02. november 2004 - 21:13 #15
100 % copy/paste
Avatar billede jonbdk Nybegynder
02. november 2004 - 22:11 #16
Prøvede lige igen - denne gang virkede det...
hmmm - jeg ved ikke helt hvad der sker...
MEn point til Arne - og tak for en god indsats
Avatar billede jonbdk Nybegynder
02. november 2004 - 22:29 #17
ahhh - tjaaa det virker ikke :( men nu ved jeg hvorfor...
HVis jeg kompilerer det med 2003 compileren fungerer det.
Men bruger jeg den nye 2005beta virker det ikke - og desværre skal jeg bruge 2005 da jeg snakker på serielle porte for at lave sms'er
Var rart at finde løsningen - selvom det er trælst det ikke virker :D
Men jeg finder nok en løsning. Tak for hjælpen
Avatar billede lmdthel Nybegynder
02. november 2004 - 22:35 #18
hej jonbdk

Hvorfor skal du lige bruge 2005 kompileren ?

Hvad bruger du af SDK til seriel kommunikationen ??

Du ved godt at du ikke nødvendigvis behøver at konvertere til PDU , hvis det kun er nogle specifikke telefoner du udvikler til.
Avatar billede arne_v Ekspert
02. november 2004 - 22:39 #19
Hm. Det undrer mig at koden ikke virker med .NET 2.0 beta, da der så vidt jeg kan se
ikke er noget som helst versions specifikt i den.

Jeg kunne måske downlode den og selv prøve.

Men det bliver ikke i aften.
Avatar billede jonbdk Nybegynder
02. november 2004 - 22:41 #20
Så vidt jeg ved, er det kun 2005 compileren der kan tilgå de serielle porte System.IO.ports;
Det er 2005 Whidbey beta1
JEg bruger den med en Ericcson T68i, og den tager ikke text mode.
Jeg kan sende sms i pdu mode nu. Jeg ville bare gerne kunne læse beskederne igen.
Var det alt du spurgte om? Ellers så spørg igen :)
Avatar billede lmdthel Nybegynder
02. november 2004 - 22:58 #21
ja jeg sidder selv og laver noget til en T65 , det er også kun PDU , typisk Ericsson.

jeg bruger et SDk fra Franson til seriel kommunikationen; www.franson.biz
Avatar billede jonbdk Nybegynder
02. november 2004 - 23:10 #22
Ja ok - der er den serielle indbygget i den nye .net 2005 - samt en anden små masse ting - men er nok fordi det er en beta at den forkludrer pdu konverteringen.
Havde du en anden måde at konvertere pdu->text før Arne lavede sin?
Avatar billede lmdthel Nybegynder
02. november 2004 - 23:17 #23
nope , jeg har pt ikke rigtig været interreseret i at gå fra PDU til tekst , men det kommer nok.

/Thomas
Avatar billede rasmushc Nybegynder
04. oktober 2006 - 20:51 #24
Det er jo en ret gammel tråd, men koden er jo rigtig godt lavet af arne_v. Jeg har løst det omtalte problem i VS2005 eller .NET 2.0 om man vil :o)

Decode  funktionen skal ændres til følgende:

        public static string Decode(byte[] b)
        {
            int boffset = 0;
            byte[] res = new byte[(b.Length * 8 + 6) / 7];
            int resoffset = 0;
            while (boffset < b.Length)
            {
                From7To8(b, ref boffset, res, ref resoffset);
            }
            int n = resoffset;
            while ((n > 0) && (res[n - 1] == 0)) n--;
            for (int i = 0; i < res.Length; i++)
            {
                if ((int)res[i] >= 128)
                {
                    res[i] = byte.Parse(string.Format("{0}", (int)res[i] - 128));
                }
            }
            return Encoding.ASCII.GetString(res, 0, n);
        }


Ellers virker resten perfekt.. godt lavet arne_v
Avatar billede arne_v Ekspert
05. oktober 2006 - 02:18 #25
tja den her kode er no næsten 2 år gammel

res[i] = byte.Parse(string.Format("{0}", (int)res[i] - 128));

kan erstattes af

res[i] = (byte)(res[i] - 128);
Avatar billede arne_v Ekspert
05. oktober 2006 - 02:36 #26
Nu er jeg lidt handicappet af at jeg ikke kender konteksten.

Men lidt kode granskning siger at det kunne være sjovt at prøve denne
ændring i.s.f. ovenstående:

    private static void From7To8(byte[] b, ref int boffset, byte[] res, ref int resoffset)
    {
        long temp = 0;
        int blen = Math.Min(b.Length - boffset, 7);
        for(int i = 0; i < blen; i++)
        {
            temp |= (((long)b[boffset + i]) << (i * 8));
        }
        boffset += blen;
        int reslen = (blen*8+6)/7;
        for(int j = 0; j < reslen; j++)
        {
            res[resoffset + j] = (byte)((temp >> (j * 7))& 0x7F); // <---- ændret fra FF til 7F
        }
        resoffset += reslen;
    }
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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