Указание количества байтов для перемещения в строку в C # - PullRequest
1 голос
/ 01 марта 2012

Это то, что я пытаюсь сделать. Я беру байтовые данные из входящей программы сокетов. По умолчанию байты, передаваемые для кодирования и добавления к моей строке, будут 1500 байтов, поскольку это размер, который я определил для массива байтов. У меня вопрос, я хотел бы знать, как передать часть байтового массива вместо целых 1500 байтов.

IPAddress localAddr = IPAddress.Parse(args[0]);
        System.Console.WriteLine("The local IP is {0}", localAddr);
        Int32 port = int.Parse(args[1]);
        System.Console.WriteLine("The port is {0}", port);
        TcpListener myListener = new TcpListener(localAddr, port);
        byte[] bytes = new byte[1500];
        string sem = "";
        do
        {
            int flag = 0;
            int rec = 1;
            Console.Write("Waiting");
            myListener.Start();
            Socket mySocket = myListener.AcceptSocket();
            // receiving the hl7 message  
            StringBuilder sbb = new StringBuilder();
            do{
            //    bytes = null;
           rec =  mySocket.Receive(bytes,SocketFlags.None);
      //     rec = mySocket.Receive(bytes);
            Console.WriteLine("rec = {0} ",rec);
            for (int i=0; i<bytes.Length; i++)
            {
                if (bytes[i]==0x1C)
                {
                flag = 1;
                }
            }
           sbb.Append(Encoding.ASCII.GetString(bytes));

            }while (flag == 0);

1 Ответ

5 голосов
/ 01 марта 2012

Во-первых, давайте проясним, что делает показанный код:

  • создает пустой байтовый массив
  • it декодирует из этого массива с использованием кодировки, создавая новую строку
  • передает эту строку для добавления в StringBuilder

Чего он не делает, так это «копирует байты в строку» - не в последнюю очередь строка представляет собой данные «char» (16 бит каждый), а не байтовые данные. Если вы хотите обрабатывать байтовые данные как символьные данные, это будет работать почти как для UTF-16 (в зависимости от порядка байтов), но не для ASCII.

Повторно выбирая, сколько добавить:

  • Encoding.GetString имеет перегрузку для указания смещения и количества байтов, которые необходимо учитывать
  • StringBuilder.Append имеет перегрузку, чтобы указать смещение и количество данных символа для рассмотрения

Здесь может быть полезен один или оба; однако, я не думаю, что код делает то, что вы думаете; Есть более простые способы инициализации StringBuilder

...