Последовательность расположения байт...
От: bknight Россия  
Дата: 17.01.07 07:56
Оценка:
Доброго времени суток!

Вопрос такой: есть сервер, который написан на старом добром C... (Исходников к нему нету). Пишу клиента на C#.
При пересылке данных серверу проблем не возникает, а вот при получении данных имеем следующее:

приходит byte[] {0x12, 0x34, 0x56, 0x78}, но после преобразования к чему-нить целочисленному (например Int32), имеем
число 0x78563412. Как мне добиться, чтоб преобразование не переставляло байты?

Пример данных:

    [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 4, CharSet = CharSet.Auto), CLSCompliant(true)]
    public class ErrorCodeEncapsulate
    {
        [MarshalAs(UnmanagedType.U4)]
        public ErrorCodes errCode = ErrorCodes.None;
    }

    public enum ErrorCodes
    {
        None = 0x00000001,
        InvalidNickOrPassword = 0x00000002,
        ServiceTemporarilyUnavailable = 0x00000004,
        AllOtherErrors = 0x00000008,
    }


Пример кода, который производит преобразование:

// получаем ч/з сеть в buffer след. массив байт:
//  0x00 0x00 0x00 0x02
// ожидаем после преобразования получить:
//  0x00000002

IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0);

ErrorCodeEncapsulate caps = new ErrorCodeEncapsulate();
Marshal.PtrToStructure(ptr, caps);

// caps.errCode == 0x02000000
// Почему и как это поправить???


Заранее благодарен!
Re: Последовательность расположения байт...
От: Аноним  
Дата: 17.01.07 08:09
Оценка:
Здравствуйте, bknight, Вы писали:

B>приходит byte[] {0x12, 0x34, 0x56, 0x78}, но после преобразования к чему-нить целочисленному (например Int32), имеем

B>число 0x78563412. Как мне добиться, чтоб преобразование не переставляло байты?

Перед преобразованием делай Array.Reverse(), тогда после преобразования будет как раз то, что пришло изначально. IMHO, это приемлемый вариант. Хотя есть вариант чуток быстрее: написать свою функцию преобразования в Int32, основанную на побитовых сдвигах.

B>Заранее благодарен!


Ещё раз повторяю, благодарить заранее — плохая идея.
Re: Последовательность расположения байт...
От: TK Лес кывт.рф
Дата: 17.01.07 08:16
Оценка:
Здравствуйте, bknight, Вы писали:

B>Вопрос такой: есть сервер, который написан на старом добром C... (Исходников к нему нету). Пишу клиента на C#.

B>При пересылке данных серверу проблем не возникает, а вот при получении данных имеем следующее:

B>приходит byte[] {0x12, 0x34, 0x56, 0x78}, но после преобразования к чему-нить целочисленному (например Int32), имеем

B>число 0x78563412. Как мне добиться, чтоб преобразование не переставляло байты?

Наверное потому, что Int32 хранится в памяти именно таким образом (для данной архитетуры). Можно воспользоваться методом IPAddress.HostToNetworkOrder|NetworkToHostOrder для преобразования в нужный вид.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Последовательность расположения байт...
От: nikda  
Дата: 17.01.07 09:10
Оценка:
Я делал программу на .Net для связи с DOS-программой. Пользовался: BinaryReader.ReadUInt32() и т.п.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.