我有4个字节表示存储在2个独立字节数组中的整数。我想将这些转换为Int32而不复制到第三个字节数组并使用memorystream读取它。
数据在两个字节数组之间拆分的原因是因为这是我的问题的一个简化示例,它涉及大量无法放入单个字节数组的数据。
有没有办法实现这个目标?我不希望将两个字节数组连接成一个thrid,因为它对我来说至关重要。
月球
答案 0 :(得分:4)
您可以使用像这样的结构布局
[StructLayout(LayoutKind.Explicit, Size=4)]
struct UnionInt32Value
{
[FieldOffset(0)] public byte byte1;
[FieldOffset(1)] public byte byte2;
[FieldOffset(2)] public byte byte3;
[FieldOffset(3)] public byte byte4;
[FieldOffset(0)] public Int32 iVal;
}
以正确的顺序分配您的字节,然后从iVal读取您的Int32;
编辑:示例代码
using System;
using System.Runtime.InteropServices;
namespace Test
{
class Program
{
[StructLayout(LayoutKind.Explicit, Size=4)]
struct UnionInt32Value
{
[FieldOffset(0)] public byte byte1;
[FieldOffset(1)] public byte byte2;
[FieldOffset(2)] public byte byte3;
[FieldOffset(3)] public byte byte4;
[FieldOffset(0)] public Int32 iVal;
}
public static void Main(string[] args)
{
UnionInt32Value v = new UnionInt32Value();
v.byte1=1;
v.byte2=0;
v.byte3=0;
v.byte4=0;
Console.WriteLine("this is one " + v.iVal);
v.byte1=0xff;
v.byte2=0xff;
v.byte3=0xff;
v.byte4=0xff;
Console.WriteLine("this is minus one " + v.iVal);
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
答案 1 :(得分:1)
这样的东西?
int x = (array1[index] << 16) + array2[index];
当然,你没有指定一种语言,但这就是它的要点。
答案 2 :(得分:1)
BitConverter
类的目的是:
byte[] parts = { byte1, byte2, byte3, byte4 };
int value = BitConverter.ToInt32(parts, 0);
答案 3 :(得分:1)
您可以使用BitConverter
两次,例如:
byte[] bytes0 = new byte[] { 255, 255 };
byte[] bytes1 = new byte[] { 0, 0 };
int res = BitConverter.ToInt16(bytes0, 0) << 16;
res |= BitConverter.ToUInt16(bytes1, 0);
产生-65536 (0b11111111 11111111 00000000 00000000)
如果您的整数部分不在数组中的第0位,您只需替换0
中的ToUint16
即可更改位置。
小扩展方法:
public static class BitConverterExt
{
public static int ToInt32(byte[] arr0, int index0, byte[] arr1, int index1)
{
int partRes = BitConverter.ToInt16(arr1, index1) << 16;
return partRes | BitConverter.ToUInt16(arr0, index0);
}
}
用法:
byte[] bytes0 = new byte[] { 0x0, 0xA };
byte[] bytes1 = new byte[] { 0x64, 0xFF };
int res = BitConverterExt.ToInt32(bytes0, 0, bytes1, 0);
//Res -10221056 (0xFF640A00)
答案 4 :(得分:0)
如果我理解正确,那么在阅读两个数组的边界时遇到问题。如果是这样的话,这个例程将读取两个数组中任意位置的整数,即使它是在两个数组中的任何一个。
int ReadInteger(byte[] array1, byte[] array2, int offset)
{
if (offset < 0 || (offset + 4) > (array1.Length + array2.Length))
throw new ArgumentOutOfRangeException();
if (offset <= (array1.Length - 4))
return BitConverter.ToInt32(array1, offset);
else if (offset >= array1.Length)
return BitConverter.ToInt32(array2, offset - array1.Length);
else
{
var buffer = new byte[4];
var numFirst = array1.Length - offset;
Array.Copy(array1, offset, buffer, 0, numFirst);
Array.Copy(array2, 0, buffer, numFirst, 4 - numFirst);
return BitConverter.ToInt32(buffer, 0);
}
}
注意:根据整数的存储方式,您可能希望更改复制字节的顺序。