Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > массив байт


Автор: Machaon 3.4.2012, 10:46
Имеется массив байт
Код

public byte[] dataBuffer = new byte[1024];

Так вот этот массив заполняется из буфера сокета но если буфер сокета меньше чем размер массива то все остальное место заполняется пустыми байтами.

Вопрос каким методом можно организовать заполнение так чтобы пустые байты не записывались в массив.

Автор: VirusUZ 3.4.2012, 10:58
Код

using System;
using System.IO;
namespace conf.App_Code.Utils {
    [Serializable]
    public class Binary : MarshalByRefObject, IBinary {
        public byte[] ReadFile(string filePath) {
            try {
                string temp =  filePath;
                return File.ReadAllBytes(temp);
            } catch { return null; }
        }
        public void Write(string filePath, byte[] b) {
            string cp = filePath;
            new FileInfo(cp).Directory.Create();
            try {
                File.WriteAllBytes(cp, b);
            } catch {
                File.Delete(cp);
                File.WriteAllBytes(cp, b);
            }
        }
        public byte[] ReadSuper(string filePath) {
            try {
                return File.ReadAllBytes(filePath);
            } catch { return null; }
        }
        public FileStream StreamSuper(string path) {
            return new FileStream(path, FileMode.Open);
        }
        public string ReadText(string path) {
            return File.ReadAllText(path);
        }
        public void CreateFolder(string path) {
            Directory.CreateDirectory(path);
        }
        public string GetDirectory(string path) {
            return Directory.GetParent(path).FullName;
        }
    }
}

Автор: Machaon 3.4.2012, 18:51
Здесь как я понимаю чтение идет из файла  и запись также идет в файл но никакой обработки на пустые байты я ну никак ни магу разглядеть 

Автор: Machaon 3.4.2012, 19:11
Проще говоря мне нужно понять как массив размером к примеру 1000байт
Код

public byte[] primermassiva = new byte[1000];

заполнить текстом чтобы в массиве хранилось только нужные мне данные к примеру:

в массив из 1000байт записываем текст преобразованный в байты допустим слово "винград" (слово винград в массиве будет находиться в байтах но я оставлю для наглядности его в стринговом значении)

Соответственно слово "винград" займет к примеру 14байт и в массиве из 1000 байтов будет выглядеть так:

винград0000000000000000000000000000000000000........


Мне же нужно оставить в массиве только те байты которые не пустые то есть чтобы в массиве хранились только байты стрингового значения а именно:

винград

Replace и всякие другие способы я пробовал работает но мне нужно знать как наиболее правильно подойти к этому вопросу чтобы в подобных ситуациях с ним больше не сталкиваться и получить наиболее рационально решение чем писать целую функцию когда можно обойтись одной строчкой.


Автор: golfV 4.4.2012, 01:20
Код

 var data = new byte[] { 0x01, 0x02, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
 var new_data = data.TakeWhile((v, index) => data.Skip(index).Any(w => w != 0x00)).ToArray();

Автор: erm0l0v 4.4.2012, 09:32
Да как написал golfV избавиться от пустых байт можно только создав массив из 14 байт. По другому никак в этом и суть массивов, если создали массив из 1000 байт то он и в памяти будет занимать место для 1000 байт)))

Автор: Machaon 4.4.2012, 22:09
Спасибо все работает но не могли бы вы мне объяснить вот эту строчку поподробнее:
Код

var new_data = data.TakeWhile((v, index) => data.Skip(index).Any(w => w != 0x00)).ToArray();

Автор: Machaon 5.4.2012, 00:07
Вопрос решен ответ был найден http://msdn.microsoft.com/ru-ru/library/bb534804.aspx.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)