Как написать прямо в память в C# - PullRequest
1 голос
/ 13 апреля 2020

Я работаю над проектом связи через последовательный порт. Существует аппаратная часть, отправляющая 16-битные целые значения со знаком, которые принимаются в приложение C# P C. Каждое значение отправляется в двух байтах, младший байт - первый.

Производительность критична, поэтому я ищу способы уменьшить обработку.

Объект C# Последовательный порт предоставляет метод ReadExisting, который возвращает текущие буферизованные значения в виде строки. Он также предоставляет метод Read, который может принимать байтовый массив, который затем заполняется байтами в буфере порта.

Если я считываю все значения в байтовом массиве, мне нужно соединить два байта вместе, чтобы получить 16-битное число.

Я заинтригован строкой, возвращенной методом ReadExisting. Если я создаю массив short (short [] MyValues), я мог бы получить расположение массива в памяти и просто записать строку в это место. Пока я гарантирую, что байты отправляются в правильном порядке, я мог бы просто читать 16-битные значения при необходимости.

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

Однако, «здесь будут драконы». У меня нет опыта работы с C# и таким уровнем доступа к памяти. Некоторый краткий гугл предполагает, что это возможно - эта статья имеет некоторую интересную информацию: https://www.developerfusion.com/article/84519/mastering-structs-in-c/

Прежде чем я направлюсь вниз по этой конкретной кроличьей норе, у кого-нибудь есть какие-либо предложения о том, как этого добиться? уровень манипулирования памятью?

Спасибо

1 Ответ

0 голосов
/ 13 апреля 2020

Попробуйте наложение

       static void Main(string[] args)
        {
            const int NUMBER_OF_BYTES = 100;
            ByteInt16 byteInt = new ByteInt16();
            byteInt.data = new byte[NUMBER_OF_BYTES];
            byteInt.data2 = new UInt16[NUMBER_OF_BYTES / 2];

            byteInt.data = Enumerable.Range(0, NUMBER_OF_BYTES).Select(x => (byte)x).ToArray();

            UInt16[] results = byteInt.data2.Select(x => (UInt16)x).ToArray();

        }

        [StructLayout(LayoutKind.Explicit)]
        public struct ByteInt16
        {
            [FieldOffset(0)]
            public byte[] data;
            [FieldOffset(0)]
            public UInt16[] data2;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...