Инициализация массива однобайтовыми буквами
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 20.12.13 06:47
Оценка:
Есть ли в C# способ вот такое
byte* name = stackalloc byte[8];
name[0] = (byte)'v';
name[1] = (byte)'e';
name[2] = (byte)'r';
name[3] = (byte)'s';
name[4] = (byte)'i';
name[5] = (byte)'o';
name[6] = (byte)'n';
name[7] = 0;

записать как-то покрасивше?
Re: Инициализация массива однобайтовыми буквами
От: Sinatr Германия  
Дата: 20.12.13 08:05
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>
СГ>byte* name = stackalloc byte[8];
СГ>


А это точно С#?

Можно написать свою функцию (для красивости — метод расширения). А можно поюзать String.ToCharArray() (и дальше linq, если нужно, а то я хз).
---
ПроГLамеры объединяйтесь..
Re[2]: Инициализация массива однобайтовыми буквами
От: Sinatr Германия  
Дата: 20.12.13 08:08
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

Забыл добавить, что нолик представляется как "\0" (или "\x00" или может еще как).
---
ПроГLамеры объединяйтесь..
Re[2]: Инициализация массива однобайтовыми буквами
От: Аноним  
Дата: 20.12.13 08:18
Оценка:
Здравствуйте, Sinatr, Вы писали:
S>Можно написать свою функцию (для красивости — метод расширения). А можно поюзать String.ToCharArray() (и дальше linq, если нужно, а то я хз).
Т.е. так?
Byte[] name = (from ch in "version\0".ToCharArray() select (Byte)ch).ToArray();
Re[3]: Инициализация массива однобайтовыми буквами
От: grigorash Россия www.geoserver.ru
Дата: 20.12.13 08:38
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Т.е. так?
Byte[] name = (from ch in "version\0".ToCharArray() select (Byte)ch).ToArray();

Ну оверхед же!
Re: Инициализация массива однобайтовыми буквами
От: Nikolay_Ch Россия  
Дата: 20.12.13 09:14
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Есть ли в C# способ вот такое

СГ>
СГ>byte* name = stackalloc byte[8];
СГ>name[0] = (byte)'v';
СГ>name[1] = (byte)'e';
СГ>name[2] = (byte)'r';
СГ>name[3] = (byte)'s';
СГ>name[4] = (byte)'i';
СГ>name[5] = (byte)'o';
СГ>name[6] = (byte)'n';
СГ>name[7] = 0;
СГ>

СГ>записать как-то покрасивше?


byte[] name = new[] { (byte)'v', (byte)'e', (byte)'s', (byte)'i', (byte)'o', (byte)'n' };



Так не подойдет?
Re: Инициализация массива однобайтовыми буквами
От: Nikolay_Ch Россия  
Дата: 20.12.13 09:18
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Есть ли в C# способ вот такое

СГ>
СГ>byte* name = stackalloc byte[8];
СГ>name[0] = (byte)'v';
СГ>name[1] = (byte)'e';
СГ>name[2] = (byte)'r';
СГ>name[3] = (byte)'s';
СГ>name[4] = (byte)'i';
СГ>name[5] = (byte)'o';
СГ>name[6] = (byte)'n';
СГ>name[7] = 0;
СГ>

СГ>записать как-то покрасивше?

Если нравится LINQ, то:

static char[] arr = new[] {'v', 'e', 'r', 's', 'i', 'o', 'n'};
static byte[] mas = arr.Select(r => (byte)r).ToArray();
Re[4]: Инициализация массива однобайтовыми буквами
От: Nikolay_Ch Россия  
Дата: 20.12.13 09:22
Оценка:
Здравствуйте, grigorash, Вы писали:

А>>Т.е. так?
Byte[] name = (from ch in "version\0".ToCharArray() select (Byte)ch).ToArray();

G>Ну оверхед же!
А в чем оверхед? Конвертацию же нужно произвести все равно.
Re[3]: Инициализация массива однобайтовыми буквами
От: Jack128  
Дата: 20.12.13 09:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Sinatr, Вы писали:

S>>Можно написать свою функцию (для красивости — метод расширения). А можно поюзать String.ToCharArray() (и дальше linq, если нужно, а то я хз).
А>Т.е. так?
Byte[] name = (from ch in "version\0".ToCharArray() select (Byte)ch).ToArray();


ToCharArray — можно убрать
Re: Инициализация массива однобайтовыми буквами
От: SuhanovSergey  
Дата: 20.12.13 09:37
Оценка: 1 (1) +3
Здравствуйте, Сергей Губанов, Вы писали:

СГ>записать как-то покрасивше?


Encoding.ASCII.GetBytes("version\0")
Re: Инициализация массива однобайтовыми буквами
От: SuhanovSergey  
Дата: 20.12.13 09:43
Оценка: +1
Полное решение

            var tmp = Encoding.ASCII.GetBytes("version\0");
            byte* name = stackalloc byte[tmp.Length];
            Marshal.Copy(tmp, 0, new IntPtr(name), tmp.Length);
Re[5]: Инициализация массива однобайтовыми буквами
От: grigorash Россия www.geoserver.ru
Дата: 20.12.13 09:47
Оценка:
Здравствуйте, Nikolay_Ch, Вы писали:

N_C>А в чем оверхед? Конвертацию же нужно произвести все равно.

В чём, в чём… В синтаксисе, конечно же.
Re: Инициализация массива однобайтовыми буквами
От: Visor2004  
Дата: 20.12.13 20:17
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>записать как-то покрасивше?


var name = System.Text.Encoding.ASCII.GetBytes("version")

писал по памяти, но смысл такой
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[2]: Инициализация массива однобайтовыми буквами
От: Igorxz  
Дата: 25.12.13 09:07
Оценка:
Здравствуйте, SuhanovSergey, Вы писали:

SS>Полное решение


SS>
SS>            var tmp = Encoding.ASCII.GetBytes("version\0");
SS>            byte* name = stackalloc byte[tmp.Length];
SS>            Marshal.Copy(tmp, 0, new IntPtr(name), tmp.Length);
SS>


смысл вот такой конструкции:
  byte* name = stackalloc byte[...];

в том, чтобы алокатить память не в управляемой куче, а на стеке.
а вот это:
  var tmp = Encoding.ASCII.GetBytes("version\0");

вызовет неявную алокацию массива в управляемой куче.
тогда вот это:
  byte* name = stackalloc byte[...];

уже бессмыслено.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.