Преобразование целого числа в byte[] определенной длины

Я пытаюсь создать функцию (С#), которая будет принимать 2 целых числа (значение, которое должно стать байтом [], значение для установки длины массива) и возвращать байт [], представляющий значение. Прямо сейчас у меня есть функция, которая возвращает только байты [] длиной 4 (я предполагаю, что 32-битные).

Например, что-то вроде InttoByteArray(0x01, 2) должно возвращать byte[] {0x00, 0x01}.

У кого-нибудь есть решение?


person WB3000    schedule 17.07.2009    source источник


Ответы (6)


Вы можете использовать следующее

    static public byte[] ToByteArray(object anyValue, int length)
    {
        if (length > 0)
        {
            int rawsize = Marshal.SizeOf(anyValue);
            IntPtr buffer = Marshal.AllocHGlobal(rawsize);
            Marshal.StructureToPtr(anyValue, buffer, false);
            byte[] rawdatas = new byte[rawsize * length];
            Marshal.Copy(buffer, rawdatas, (rawsize * (length - 1)), rawsize);
            Marshal.FreeHGlobal(buffer);
            return rawdatas;
        }
        return new byte[0];
    }

Некоторые тестовые примеры:

    byte x = 45;
    byte[] x_bytes = ToByteArray(x, 1);

    int y = 234;
    byte[] y_bytes = ToByteArray(y, 5);

    int z = 234;
    byte[] z_bytes = ToByteArray(z, 0);

Это создаст массив любого размера, тип которого вы передаете. Если вы хотите возвращать только массивы байтов, это должно быть довольно легко изменить. Прямо сейчас это в более общей форме

Чтобы получить то, что вы хотите в своем примере, вы можете сделать это:

    int a = 0x01;
    byte[] a_bytes = ToByteArray(Convert.ToByte(a), 2);
person SwDevMan81    schedule 17.07.2009

Для этого можно использовать служебный класс BitConverter. Хотя я не думаю, что это позволяет вам указывать длину массива при преобразовании int. Но вы всегда можете обрезать результат.

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

person Spencer Ruport    schedule 17.07.2009

Возьмите свой текущий алгоритм и отрежьте байты от массива, если указанная длина меньше 4, или дополните его нулями, если он больше 4. Похоже, вы уже решили эту проблему для меня.

person Welbog    schedule 17.07.2009

Вам нужен цикл, например:

for(int i = arrayLen - 1 ; i >= 0; i--) {
  resultArray[i] = (theInt >> (i*8)) & 0xff; 
}
person nos    schedule 17.07.2009

byte[] IntToByteArray(int number, int bytes)
{
    if(bytes > 4 || bytes < 0)
    {
        throw new ArgumentOutOfRangeException("bytes");
    }
    byte[] result = new byte[bytes];
    for(int i = bytes-1; i >=0; i--)
    {
        result[i] = (number >> (8*i)) & 0xFF;
    }
    return result;
}

Он заполняет массив result справа налево байтами от меньшего к старшему.

person R. Martinho Fernandes    schedule 17.07.2009

byte byte1 = (byte)((mut & 0xFF) ^ (mut3 & 0xFF));
byte byte2 = (byte)((mut1 & 0xFF) ^ (mut2 & 0xFF));

цитата из

C#: невозможно преобразовать из ulong в byte

person Srikar Doddi    schedule 17.07.2009
comment
Не решает проблему. Предполагалось, что он будет работать для произвольного количества запрошенных байтов, а не только для двух. - person R. Martinho Fernandes; 17.07.2009