Avatar billede raos Nybegynder
20. februar 2007 - 16:35 Der er 3 kommentarer

Søges: En mere elegant løsning

Jeg ønsker at gennemløbe at byte array og tage klumper af bytes ud i et buffer byte array for der efter at sende dem til en webservice der kun acceperer 2 bytes af gangen.

Jeg har konstrueret nedenstående som virker, men er langtfra elegant. Input ønskes til hvordan det laves bedre:

class Program {
        static void Main(string[] args) {
            //lave test array
            byte[] arrOrg = (byte[])Array.CreateInstance(typeof(byte), 7);

            arrOrg[0] = 0;
            arrOrg[1] = 1;
            arrOrg[2] = 2;
            arrOrg[3] = 3;
            arrOrg[4] = 4;
            arrOrg[5] = 5;
            arrOrg[6] = 6;
           
            //kør test send metoden
            byte[] arrNew = Send(arrOrg);
            //check at alt blev sendt
            if (arrNew.Length != arrOrg.Length) {
                Console.WriteLine("Forskellig længde");
                return;
            }
            for (int i = 0; i < arrOrg.Length; i++) {
                if (arrOrg[i] !=arrNew[i]) {
                    Console.WriteLine("Forskelligt indhold");
                    return;
                }
            }

            Console.WriteLine("OK!");
           
        }
        //send metoden. Lige nu returnere den data istedet for at sende dem. Dette er blot så vi i Main() kan teste om alt blev sendt
        static byte[] Send(byte[] sourceArray) {
            int chuckSize = 2;
            int indexInSourceArray=0;
            byte[] arrOut = new byte[sourceArray.Length];
            byte[] buffer = new byte[chuckSize];
            while (indexInSourceArray + chuckSize <= sourceArray.GetUpperBound(0)) {
                Array.Copy(sourceArray, indexInSourceArray, buffer, 0, chuckSize);
                //Her skal webservice kaldes, men for nu lægger vi data over i arrOut så vi kan check det i Main()
                Array.Copy(buffer,0,arrOut,indexInSourceArray,buffer.Length);
                indexInSourceArray += chuckSize;
            }
            int remainder = sourceArray.GetUpperBound(0) - indexInSourceArray+1;
            if (remainder>0) {
                Array.Copy(sourceArray, indexInSourceArray, buffer, 0, remainder);
                Array.Copy(buffer, 0, arrOut, indexInSourceArray, remainder);
            }
       
            return arrOut;
        }
    }
Avatar billede dr_chaos Nybegynder
20. februar 2007 - 16:43 #1
arrOrg[0] = 0;
            arrOrg[1] = 1;
            arrOrg[2] = 2;
            arrOrg[3] = 3;
            arrOrg[4] = 4;
            arrOrg[5] = 5;
            arrOrg[6] = 6;
kan laves til
for (int i = 0; i < arrOrg.Length; i++)
{
arrOrg[i] =i;
            }
Avatar billede raos Nybegynder
20. februar 2007 - 18:26 #2
Det var metoden Send jeg var ude efter at lave på en anden måde. Main er blot et test program
Avatar billede driis Nybegynder
20. februar 2007 - 19:33 #3
Nu ved jeg ikke om du vil håndtere et ulige antal bytes, dvs. kun sende én sidste gang ?

Men ellers, kunne denne være et bud:
using System;

namespace TestSend
{
    class Program
    {
        private const int chunkSize = 2;

        static void Main(string[] args)
        {
            byte [] test = new byte[] {0x20,0x30,0x21,0x31,0x50};
            Send(test);
        }

        private static void Send(byte[] data)
        {
            byte [] buffer = new byte[chunkSize];
            int chunks = 0;
            int remain = data.Length;
            while(remain > 0)
            {
                Array.Copy(data, chunks * chunkSize, buffer, 0, remain > 2 ? 2 : remain);
                MyCoolWebservice(buffer);
                remain = data.Length - ++chunks * chunkSize;
            }
        }

        static void MyCoolWebservice(byte [] buffer)
        {
            Console.WriteLine("{0:x}-{1:x}", buffer[0],buffer[1]);
        }
    }
}
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