2009-07-17 5 views
1

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

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

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

ответ

0

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

2

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

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

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

цитировал

C#: Cannot convert from ulong to byte

+0

Не решает эту проблему. Предполагалось работать на произвольное количество запрошенных байтов, а не только на два. –

0

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

for(int i = arrayLen - 1 ; i >= 0; i--) { 
    resultArray[i] = (theInt >> (i*8)) & 0xff; 
} 
0
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 справа налево с байтами от менее значительного.

2

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

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);