将8个字节转换为一个长整数

时间:2014-03-30 09:26:36

标签: c# encapsulation

我目前正在开发一款基于C#2D沙盒的游戏。游戏世界充满了瓷砖/块。由于世界如此之大,游戏有时可以使用超过32位应用程序所允许的范围。

我的图块由结构中的以下数据组成:

    public byte type;
    public byte typeWall;
    public byte liquid;
    public byte typeLiquid;
    public byte frameX;
    public byte frameY;
    public byte frameWallX;
    public byte frameWallY;

我希望将所有这些数据封装在一个“长”(64位整数)中。

我希望使用位移来获取和设置每个数据的属性...(我从未这样做过)。

这会节省空间吗?它会提高处理速度吗?如果是这样,怎么办呢?

感谢。

3 个答案:

答案 0 :(得分:0)

我不知道你为什么要这样做,但你可以这样做:

byte type = 4;
byte typeWall = 45;
byte liquid = 45;
byte typeLiquid = 234;
byte frameX = 23;
byte frameY = 23;
byte frameWallX = 22;
byte frameWallY = 221;

byte[] bytes = new [] {type, typeWall, liquid, typeLiquid, frameX, frameY, frameWallX, frameWallY};

BitConverter.ToInt64(bytes, 0);

或使用<<(shift)运算符。

答案 1 :(得分:0)

  

我希望将所有这些数据封装在一个“长”(64位整数)中。

您可以将StructLayoutAttributeLayoutKind.Explicit一起使用,然后用FieldOffsetAttribute指定确切位置的字段。

  

我希望使用位移来获取和设置每个数据的属性...(我从未这样做过)。

然后使用左移(<<),右移(>>)和屏蔽(和&&提取/或||写(不要忘记目标字节中的任何非零位))0xff用于分隔各个字节。阅读有关按位运算的更多信息here

  

这会节省空间吗?它会提高处理速度吗?

你测量过了吗?您是否发现了性能/内存消耗问题?如果是,请进行优化。如果没有,请不要premature optimizations。换句话说,不要在没有先测量的情况下盲目尝试。

答案 2 :(得分:0)

通过将以下代码粘贴到linqpad中可以看到:

void Main()
{
    sizeof(byte).Dump("byte size");
    sizeof(Int32).Dump("int 32");
    sizeof(Int64).Dump("int 64");
    sizeof(char).Dump("for good measure, a char:");
}

你会得到:

byte size   1 
int 32      4 
int 64      8 
for good measure, a char: 2 

因此在int64中打包8个字节是相同的,但是你必须自己玩这些位(如果这是你的事情,那么一定要去吧:)