我有一個字節數組,我想從這個數組中讀取一個整數。我該怎麼做?如何從一個字節讀取整數[]
事情是這樣的:
int i;
tab = new byte[32];
i = readint(tab,0,3); // i = int from tab[0] to tab[3] (int = 4 bytes?)
i = readint(tab,4,7);
等等
我有一個字節數組,我想從這個數組中讀取一個整數。我該怎麼做?如何從一個字節讀取整數[]
事情是這樣的:
int i;
tab = new byte[32];
i = readint(tab,0,3); // i = int from tab[0] to tab[3] (int = 4 bytes?)
i = readint(tab,4,7);
等等
byte[] bytes = { 0, 0, 0, 25 };
// If the system architecture is little-endian (that is, little end first),
// reverse the byte array.
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
int i = BitConverter.ToInt32(bytes, 0);
Console.WriteLine("int: {0}", i);
你可以使用BitConverter.ToInt32
。看看this。
如果您想手動執行此操作,應該這樣做!
byte[] data = ...;
int startIndex = 0;
int value = data[startIndex];
for (int i=1;i<4;i++)
{
value <<= 8;
value |= data[i+startIndex];
}
另外,有一種叫做Endian
類喬恩斯基特的miscutil library它實現一個字節數組和各種原始類型,考慮字節序考慮之間的轉換方法。
對於你的問題,用法是這樣的:
// Input data
byte[] tab = new byte[32];
// Pick the appropriate endianness
Endian endian = Endian.Little;
// Use the appropriate endian to convert
int a = endian.ToInt32(tab, 0);
int b = endian.ToInt32(tab, 4);
int c = endian.ToInt32(tab, 8);
int d = endian.ToInt32(tab, 16);
...
Endian類的簡化版本會是這樣的:
public abstract class Endian
{
public short ToInt16(byte[] value, int startIndex)
{
return unchecked((short)FromBytes(value, startIndex, 2));
}
public int ToInt32(byte[] value, int startIndex)
{
return unchecked((int)FromBytes(value, startIndex, 4));
}
public long ToInt64(byte[] value, int startIndex)
{
return FromBytes(value, startIndex, 8);
}
// This same method can be used by int16, int32 and int64.
protected virtual long FromBytes(byte[] buffer, int startIndex, int len);
}
然後是FromBytes
抽象方法的實現方式不同的每個末端類型。
public class BigEndian : Endian
{
protected override long FromBytes(byte[] buffer, int startIndex, int len)
{
long ret = 0;
for (int i=0; i < len; i++)
{
ret = unchecked((ret << 8) | buffer[startIndex+i]);
}
return ret;
}
}
public class LittleEndian : Endian
{
protected override long FromBytes(byte[] buffer, int startIndex, int len)
{
long ret = 0;
for (int i=0; i < len; i++)
{
ret = unchecked((ret << 8) | buffer[startIndex+len-1-i]);
}
return ret;
}
}
我認爲如果在這裏還有一些用於從整數中產生字節的代碼,那將會很棒。否則(在大多數情況下)有人不能使用此代碼,而不會猜測該部分。 :( – user2173353 2016-10-04 14:54:14
雖然表現明智,但最好有兩個單獨的類爲Big和Little endian,而不是每次顛倒數組。此外,由於OP的原始問題具有4個整數,所以單個4字節的單詞將不得不顛倒。由於系統架構是事先已知的,OOP方法會更有意義。 – Groo 2011-06-16 10:15:37
@ Groo:海報的代碼片段有一個4字節的數組 – 2011-06-17 02:56:13