我正在尝试创建一个函数(C#),该函数将采用2个整数(一个值成为byte [],一个值来设置数组的长度)并返回表示该值的byte []。现在,我有一个函数只返回长度为4的byte [] s(我假设是32位)。
例如,像InttoByteArray(0x01,2)这样的东西应该返回{0x00,0x01}的byte []。
有没有人有解决方案?
答案 0 :(得分:2)
您可以使用BitConverter实用程序类。虽然我不认为它允许您在转换int时指定数组的长度。但是你总是可以截断结果。
答案 1 :(得分: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);
答案 2 :(得分:0)
如果指定的长度小于4,请使用当前算法并从数组中删除字节,或者如果超过4则用零填充它。听起来你已经解决了我的问题。
答案 3 :(得分:0)
你想要一些循环:
for(int i = arrayLen - 1 ; i >= 0; i--) {
resultArray[i] = (theInt >> (i*8)) & 0xff;
}
答案 4 :(得分: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
数组,字节从较小到最重要。
答案 5 :(得分:-2)
byte byte1 = (byte)((mut & 0xFF) ^ (mut3 & 0xFF)); byte byte2 = (byte)((mut1 & 0xFF) ^ (mut2 & 0xFF));
引自