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