Преобразовать целое число в байт [] определенной длины - PullRequest
1 голос
/ 17 июля 2009

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

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

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

Ответы [ 6 ]

2 голосов
/ 17 июля 2009

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

    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);
2 голосов
/ 17 июля 2009

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

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

0 голосов
/ 17 июля 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 справа налево байтами от младшего к старшему.

0 голосов
/ 17 июля 2009

Вы бы хотели цикл вроде:

for(int i = arrayLen - 1 ; i >= 0; i--) {
  resultArray[i] = (theInt >> (i*8)) & 0xff; 
}
0 голосов
/ 17 июля 2009
byte byte1 = (byte)((mut & 0xFF) ^ (mut3 & 0xFF));
byte byte2 = (byte)((mut1 & 0xFF) ^ (mut2 & 0xFF));

цитата из

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

0 голосов
/ 17 июля 2009

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

...