我正在开发一个项目,我需要在字节级别处理整数。由于节省空间是首要考虑因素,我只需要非常小(和可变长度的int)。
有没有办法可以将int'4096'变成3个字节?或'1053'成2个字节?
显然我cna手动执行=(byte [0] * 256)+(byte [1]),但我想知道是否有更简单的选项将int转换为x字节并再次返回?
答案 0 :(得分:14)
如果这是一个桌面应用,那么节省空间究竟是一个主要考虑因素,尤其是每个元素说1个字节时?元素访问的性能损失可能会让您改变一个字节的重要性。
我认为,如果那个1字节确实很重要,那么也许,也许,或许,你正在使用错误的语言。你首先保存我没有安装和使用CLR的字节数是这些字节的 lot 。
旁注:你也做一个转变,而不是乘法(虽然编译器可能会为你做到这一点)。
答案 1 :(得分:5)
您可以进行可变长度整数编码。多年前的旧方法是使用每个字节的高位来表示整数继续到另一个字节。所以每个字节丢失一位,但获得小整数。这在持久存储中非常有用,其中每个最后一个字节都很重要。
示例:假设我们正在处理无符号整数,我们将
int binary
0 00000000
1 00000001
...
127 01111111
128 00000001 10000000
129 00000001 10000001
...
255 00000001 11111111
256 00000010 10000000
...
16383 01111111 11111111
16384 00000001 10000000 10000000
所以0-127需要1个字节,128-16383需要2个字节,等等......
有关更复杂的方法,请查看this page
答案 2 :(得分:5)
只是为了增加精神错乱,让我们使用旧的C风格联合技巧在C#中实现:
[StructLayout(LayoutKind.Explicit)]
struct OddUnion
{
/* The 32-bit integer value */
[FieldOffset(0)]
public int IntegerValue;
/* The bytes that overlap with it */
[FieldOffset(0)]
public byte Byte1;
[FieldOffset(1)]
public byte Byte2;
[FieldOffset(2)]
public byte Byte3;
[FieldOffset(3)]
public byte Byte4;
}
然后,当你想“转换”时,请执行以下操作:
OddUnion myOddUnion;
myOddUnion.IntegerValue = 4096;
Byte secondByte = myOddUnion.Byte1;
但是,如果您希望“节省”从单词中移出单个字节的成本,那么这只会有所帮助。我没有看过生成的SMIL,所以我不知道这是否比任何其他解决方案更便宜。
答案 3 :(得分:3)
BitConverter.GetBytes
会得到你的字节。
和
BitConverter.ToInt32
将从字节中获取32位int。
答案 4 :(得分:1)
你必须做一些转移。如果使用HEX会更容易,因为每个数字(我的意思是每个数字,但数字是基数10,十六进制git)代表四位。