C# 将整数转换为特定长度的字节[]

C# 将整数转换为特定长度的字节[],c#,function,integer,bytearray,C#,Function,Integer,Bytearray,我正在尝试创建一个函数(C#),它将接受2个整数(一个值将变成字节[],一个值将数组的长度设置为[]),并返回一个表示该值的字节[]。现在,我有一个函数,它只返回长度为4的字节[]s(我假定为32位) 例如,类似InttoByteArray(0x01,2)的内容应该返回一个{0x00,0x01}的字节[] 有人对此有解决方案吗?如果指定的长度小于4,则使用当前算法从数组中删除字节,如果长度大于4,则用零填充。听起来您已经解决了这个问题。如果指定的长度小于4,则使用当前算法从数组中删除字节,如果长

我正在尝试创建一个函数(C#),它将接受2个整数(一个值将变成字节[],一个值将数组的长度设置为[]),并返回一个表示该值的字节[]。现在,我有一个函数,它只返回长度为4的字节[]s(我假定为32位)

例如,类似InttoByteArray(0x01,2)的内容应该返回一个{0x00,0x01}的字节[]


有人对此有解决方案吗?

如果指定的长度小于4,则使用当前算法从数组中删除字节,如果长度大于4,则用零填充。听起来您已经解决了这个问题。

如果指定的长度小于4,则使用当前算法从数组中删除字节,如果长度大于4,则用零填充。听起来您已经解决了这个问题。

您可以使用BitConverter实用程序类来解决这个问题。虽然我不认为它允许您在转换int时指定数组的长度,但您始终可以截断结果


您可以为此使用BitConverter实用程序类。虽然我不认为它允许您在转换int时指定数组的长度,但您始终可以截断结果

引自

引自


您可能需要一些循环,如:

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

您需要一些循环,如:

for(int i = arrayLen - 1 ; i >= 0; i--) {
  resultArray[i] = (theInt >> (i*8)) & 0xff; 
}
byte[]IntToByteArray(整数,整数字节)
{
如果(字节>4 | |字节<0)
{
抛出新ArgumentOutOfRangeException(“字节”);
}
字节[]结果=新字节[字节];
对于(int i=bytes-1;i>=0;i--)
{
结果[i]=(数字>>(8*i))&0xFF;
}
返回结果;
}
它用从低到高的字节从右到左填充
结果
数组。

字节[]IntToByte数组(int number,int bytes)
{
如果(字节>4 | |字节<0)
{
抛出新ArgumentOutOfRangeException(“字节”);
}
字节[]结果=新字节[字节];
对于(int i=bytes-1;i>=0;i--)
{
结果[i]=(数字>>(8*i))&0xFF;
}
返回结果;
}

它用从低到高的字节从右到左填充
结果

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

您可以使用以下命令

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

这并不能解决问题。本应适用于请求的任意字节数,而不仅仅是两个。但这并不能解决问题。应该可以处理任意数量的请求字节,而不仅仅是两个。