Байтовый доступ к int C#
От: MScanner  
Дата: 29.08.09 11:51
Оценка:
В С++ можно было так


char * p;
DWORD dw;
DWORD dwIndex;

*((DWORD*)p+dwIndex)=dw;


Как можно сделать подобное в C# а иммено интересует, например, как получить доступ к третьему байту переменной типа int (чтение и запись).
Про использование в решении этой задачи MemoryStream BinaryReader/Writer знаю- мне нужен более быстрый способ.
Re: Байтовый доступ к int C#
От: Кондраций Россия  
Дата: 29.08.09 12:56
Оценка:
Здравствуйте, MScanner, Вы писали:

...
MS>Как можно сделать подобное в C# а иммено интересует, например, как получить доступ к третьему байту переменной типа int (чтение и запись).
MS>Про использование в решении этой задачи MemoryStream BinaryReader/Writer знаю- мне нужен более быстрый способ.

BitConverter ?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Сообщение заговорено потомственным колдуном, целителем и магом в девятом поколении!
Модерирование или минусование сообщения ведет к половому бессилию, венерическим заболеваниям, венцу безбрачия и диарее!
Re: Байтовый доступ к int C#
От: Aen Sidhe Россия Просто блог
Дата: 29.08.09 13:51
Оценка: 3 (1)
Здравствуйте, MScanner, Вы писали:


MS>В С++ можно было так



MS>
MS>char * p;
MS>DWORD dw;
MS>DWORD dwIndex;

MS>*((DWORD*)p+dwIndex)=dw;
MS>


MS>Как можно сделать подобное в C# а иммено интересует, например, как получить доступ к третьему байту переменной типа int (чтение и запись).

MS>Про использование в решении этой задачи MemoryStream BinaryReader/Writer знаю- мне нужен более быстрый способ.

У меня примерно так:
        public static byte[] Decode(uint[] l)
        {
            byte[] result = new byte[l.Length * 4];
            for (int i = 0; i < l.Length; i++)
            {
                result[i * 4 + 0] = (byte)((l[i] >> 24) & 0xFF);
                result[i * 4 + 1] = (byte)((l[i] >> 16) & 0xFF);
                result[i * 4 + 2] = (byte)((l[i] >> 8) & 0xFF);
                result[i * 4 + 3] = (byte)((l[i] >> 0) & 0xFF);
            }
            return result;
        }
С уважением, Анатолий Попов.
ICQ: 995-908
Re[2]: Байтовый доступ к int C#
От: MScanner  
Дата: 29.08.09 18:00
Оценка:
Здравствуйте, Aen Sidhe, Вы писали:

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



MS>>В С++ можно было так



MS>>
MS>>char * p;
MS>>DWORD dw;
MS>>DWORD dwIndex;

MS>>*((DWORD*)p+dwIndex)=dw;
MS>>


MS>>Как можно сделать подобное в C# а иммено интересует, например, как получить доступ к третьему байту переменной типа int (чтение и запись).

MS>>Про использование в решении этой задачи MemoryStream BinaryReader/Writer знаю- мне нужен более быстрый способ.

AS>У меня примерно так:

AS>
AS>        public static byte[] Decode(uint[] l)
AS>        {
AS>            byte[] result = new byte[l.Length * 4];
AS>            for (int i = 0; i < l.Length; i++)
AS>            {
AS>                result[i * 4 + 0] = (byte)((l[i] >> 24) & 0xFF);
AS>                result[i * 4 + 1] = (byte)((l[i] >> 16) & 0xFF);
AS>                result[i * 4 + 2] = (byte)((l[i] >> 8) & 0xFF);
AS>                result[i * 4 + 3] = (byte)((l[i] >> 0) & 0xFF);
AS>            }
AS>            return result;
AS>        }
AS>


Спасибо, совсем забыл про лог. операции
Re[3]: Байтовый доступ к int C#
От: Lloyd Россия  
Дата: 29.08.09 18:14
Оценка: +1 :)
Здравствуйте, MScanner, Вы писали:

MS>Спасибо, совсем забыл про лог. операции


А это и не они. Это побитовые операции.
Re[2]: Байтовый доступ к int C#
От: RegisteredUser  
Дата: 29.08.09 19:01
Оценка:
Здравствуйте, Aen Sidhe, Вы писали:

AS>У меня примерно так:

AS>
AS>        public static byte[] Decode(uint[] l)
AS>        {
AS>            byte[] result = new byte[l.Length * 4];
AS>            for (int i = 0; i < l.Length; i++)
AS>            {
AS>                result[i * 4 + 0] = (byte)((l[i] >> 24) & 0xFF);
AS>                result[i * 4 + 1] = (byte)((l[i] >> 16) & 0xFF);
AS>                result[i * 4 + 2] = (byte)((l[i] >> 8) & 0xFF);
AS>                result[i * 4 + 3] = (byte)((l[i] >> 0) & 0xFF);
AS>            }
AS>            return result;
AS>        }
AS>


А чем же BitConverter который выше подсказали
Автор: Кондраций
Дата: 29.08.09
не угодил?

        public static byte[] Decode(uint[] l)
        {
            return l.SelectMany(u => BitConverter.GetBytes(u)).ToArray();
        }
Re: Байтовый доступ к int C#
От: vit_as Россия  
Дата: 29.08.09 19:14
Оценка:
Здравствуйте, MScanner, Вы писали:


MS>В С++ можно было так



MS>
MS>char * p;
MS>DWORD dw;
MS>DWORD dwIndex;

MS>*((DWORD*)p+dwIndex)=dw;
MS>


MS>Как можно сделать подобное в C# а иммено интересует, например, как получить доступ к третьему байту переменной типа int (чтение и запись).

MS>Про использование в решении этой задачи MemoryStream BinaryReader/Writer знаю- мне нужен более быстрый способ.

Можно использовать unsafe

unsafe
{
      int lll = 1234567;
      int* p = &lll;
      byte* pp = (byte*)p;
      pp[0] = 10;
      pp[1] = 20;
      pp[2] = 255;
      pp[3] = 1;
}
Re: Байтовый доступ к int C#
От: Mizantrop  
Дата: 30.08.09 04:29
Оценка:
Здравствуйте, MScanner, Вы писали:


MS>В С++ можно было так


На C# можно так

static void SetByte(ref Int32 iValue, byte bValue, int ByteIndex)
{
    ByteIndex = (ByteIndex % 4) * 8;
    iValue = (iValue & ~(0xFF << ByteIndex)) | (bValue << ByteIndex);
}

static byte GetByte(Int32 iValue, int ByteIndex)
{
    ByteIndex = (ByteIndex % 4) * 8;
    return (byte)(0xFF & (iValue >> ByteIndex));
}

Ещё можно использовать промежуточную структуру с заданным FieldOffset, но надо не забывать о платформозависимости порядка следования байт.
"Нормальные герои всегда идут в обход!"
Re[3]: Байтовый доступ к int C#
От: Aen Sidhe Россия Просто блог
Дата: 30.08.09 07:01
Оценка:
Здравствуйте, RegisteredUser, Вы писали:

RU>Здравствуйте, Aen Sidhe, Вы писали:


RU>А чем же BitConverter который выше подсказали
Автор: Кондраций
Дата: 29.08.09
не угодил?


RU>
RU>        public static byte[] Decode(uint[] l)
RU>        {
RU>            return l.SelectMany(u => BitConverter.GetBytes(u)).ToArray();
RU>        }
RU>


Тем, что я о нём не знал. Посмотрю, если порядок байтов будет тем же (мне это важно), то перепишу свой велосипед на эту функцию, спасибо.
С уважением, Анатолий Попов.
ICQ: 995-908
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.