Конвертировать в байтовый массив и вставить в другой массив - PullRequest
2 голосов
/ 21 октября 2010

Я работаю в приложении ac # wpf, в котором я хочу сделать несколько вещей.Я работаю с байтовыми массивами для составления сообщений MIDI Show Control (указанных в спецификации MSC 1.0).

Структура этого сообщения такова, что байт 0x00 подобен запятой между всеми частями сообщения.Я составляю сообщение, подобное этому:

 byte[] data =         
                                        {(byte)0xF0, //  SysEx
                                         (byte)0x7F, //  Realtime
                                         (byte)0x7F, //  Device id
                                         (byte)0x02, //  Constant
                                         (byte)0x01, //  Lighting format 
                                         (commandbyte), //  GO         
                                         (qnumber), //  qnumber     
                                         (byte)0x00, //  comma
                                         (qlist), //  qlist 
                                         (byte)0x00, //  comma
                                         (byte)0xF7, //  End of SysEx        


            };

Я хочу, чтобы пользователь заполнял целые числа без знака (например, 215.5), и я хочу преобразовать эти числа в байты (без 0x00 байтов, потому что тогда сообщение интерпретируется неправильно).

Как лучше всего преобразовать числа и поместить байтовый массив в места, упомянутые выше?

Ответы [ 2 ]

1 голос
/ 27 октября 2010

Обнаружил это так:

Использовал чужой код конвертера, например:

static byte[] VlqEncode(int value)    
{
    uint uvalue = (uint)value;
    if (uvalue < 128) 
        return new byte[] { (byte)uvalue };

    // simplest case        
    // calculate length of buffer required
    int len = 0;                    
    do 
    {            
        uvalue >>= 7;
    } while (uvalue != 0);

    // encode        
    uvalue = (uint)value;        
    byte[] buffer = new byte[len];
    int offset = 0;        
    do {            buffer[offset] = (byte)(uvalue & 127); 
        // only the last 7 bits            
        uvalue >>= 7;            if(uvalue != 0) buffer[offset++] |= 128; 
        // continuation bit        
    } while (uvalue != 0);        
    return buffer;    
}

Затем я использую это для преобразования целого числа:

byte[] mybytearray = VlqEncode(integer);

Затем я создаю новый массив, в который я добавляю каждый элемент в последовательности:

ArrayList mymessage = new ArrayList();
foreach(byte uvalue in mymessage)
{
    mymessage.Add((byte)uvalue);
}
mymessage.Add((byte)0x00);

`и так далее, пока не получу правильное сообщение.Затем мне нужно преобразовать этот байтовый массив так:

byte[] data = new byte[mymessage.count];
data = (byte[])mymessage.ToArray(typeof(byte));`
1 голос
/ 21 октября 2010

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

http://msdn.microsoft.com/en-us/library/system.bitconverter.aspx

Но я не уверен, какое руководство вы ищите для размещения элементов в вашем массиве. Array.Copy может просто скопировать байты, но, возможно, я неправильно понимаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...