Avatar billede xenoxsis Nybegynder
12. september 2011 - 09:22 Der er 5 kommentarer

Konvertering til 7 bit binær

Hej Eksperter,

Jeg skal lave en PDU encoder og har brug for at få lavet en char om til en ASCII værdi og igen om til en 7 bit binær værdi, for derefter manuelt at konvertere den til en 8 bit binær (da PDU kører 8 bit).

Jeg har tidligere brugt følgende metode:

Convert.ToInt32('a')    = 97
Convert.ToString(97, 2) = "1100001"

Og det er ganske rigtigt en 7 bit binær som jeg så kan arbejde videre med. Men når jeg så skal konvertere danske karakterer som f.eks. ø går der skidt i den:

Convert.ToInt32('ø')    = 248
Convert.ToString(248, 2) = "11111000"

Den konverterer 'ø' til 8 bit, og det kan jeg ikke bruge. Er der en der ved hvordan jeg kan konvertere danske tegn til 7 bit binær?
Avatar billede Syska Mester
12. september 2011 - 10:02 #1
7 bit er jo kun op til 128 ... så hvordan vil du repræsentere noget som er over 7bit?

mvh
Avatar billede xenoxsis Nybegynder
12. september 2011 - 10:07 #2
Det kan du have ret i. Men grunden til at jeg skal bruge 7 bit, er fordi jeg skal konvertere til PDU via følgende metode: http://www.dreamfabric.com/sms/hello.html

Og som du kan se bruger den 7 bit, og konverterer det til 8 bit. Har du en løsning til hvordan jeg så kan ændre i den konverterings metode så den ikke bliver forkert når jeg så HAR en 8 bit.
Avatar billede Syska Mester
12. september 2011 - 10:39 #3
Hvis man læser på: http://www.dreamfabric.com/sms/

Så står der at man kan angive data som 8bit i stedet for 7bit, som jeg lige læser det.

Kig på "TP-DCS" flaget og på: http://www.dreamfabric.com/sms/dcs.html

mvh
Avatar billede arne_v Ekspert
12. september 2011 - 15:02 #4
For en 4.5 aar siden lavede jeg dette til et andet spoergsmaal.

Det kan ikke udelukkes at det virker.

using System;
using System.Text;

namespace E
{
    public class SMSPDUEncoding : Encoding
    {
        public override int GetMaxByteCount(int charCount)
        {
            return charCount;
        }
        public override int GetMaxCharCount(int byteCount)
        {
            return byteCount;
        }
        public override int GetChars(byte[] bytes, int byteIndex, int byteCountint charIndex), char[] chars,
        {
            for(int i = 0; i < byteCount; i++)
            {
                if(bytes[byteIndex + i] == 0x1C)
                {
                    chars[charIndex + i] = 'Æ';
                }
                else if(bytes[byteIndex + i] == 0x0B)
                {
                    chars[charIndex + i] = 'Ø';
                }
                else if(bytes[byteIndex + i] == 0x0F)
                {
                    chars[charIndex + i] = 'Å';
                }
                else if(bytes[byteIndex + i] == 0x1D)
                {
                    chars[charIndex + i] = 'æ';
                }
                else if(bytes[byteIndex + i] == 0x0C)
                {
                    chars[charIndex + i] = 'ø';
                }
                else if(bytes[byteIndex + i] == 0x0E)
                {
                    chars[charIndex + i] = 'å';
                }
                else if(bytes[byteIndex + i] >= 32 && bytes[byteIndex + i] <= 126)
                {
                    chars[charIndex + i] = (char)bytes[byteIndex + i];
                }
                else
                {
                    throw new ArgumentException("Unsupported byte");
                }
            }
            return byteCount;
        }
        public override int GetCharCount(byte[] bytes, int index,int count)
        {
            return count;
        }
        public override int GetBytes(char[] chars, int charIndex, int charCountbyte[] bytes, int byteIndex),
        {
            for(int i = 0; i < charCount; i++)
            {
                if(chars[charIndex + i] == 'Æ')
                {
                    bytes[byteIndex + i] = 0x1C;
                }
                else if(chars[charIndex + i] == 'Ø')
                {
                    bytes[byteIndex + i] = 0x0B;
                }
                else if(chars[charIndex + i] == 'Å')
                {
                    bytes[byteIndex + i] = 0x0F;
                }
                else if(chars[charIndex + i] == 'æ')
                {
                    bytes[byteIndex + i] = 0x1D;
                }
                else if(chars[charIndex + i] == 'ø')
                {
                    bytes[byteIndex + i] = 0x0C;
                }
                else if(chars[charIndex + i] == 'å')
                {
                    bytes[byteIndex + i] = 0x0E;
                }
                else if(chars[charIndex + i] >= ' ' && chars[charIndex + i] <= '~')
                {
                    bytes[byteIndex + i] = (byte)chars[charIndex + i];
                }
                else
                {
                    throw new ArgumentException("Unsupported char");
                }
            }
            return charCount;
        }
        public override int GetByteCount(char[] chars, int index, int count)
        {
            return count;
        }
    }
    public class MainClass
    {
        public static void Main(string[] args)
        {
            string s = "ABCabcÆØÅæøå";
            Encoding enc = new SMSPDUEncoding();
            byte[] b = enc.GetBytes(s);
            Console.WriteLine(b[6] + " " + b[7] + " " + b[8] +
                              " " + b[9] + " " + b[10] + " " + b[11]);
            string s2 = enc.GetString(b);
            Console.WriteLine(s2);
        }
    }
}
Avatar billede arne_v Ekspert
14. oktober 2011 - 23:52 #5
xeno?
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