首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >byte[] to byte*属性

byte[] to byte*属性
EN

Stack Overflow用户
提问于 2010-10-12 21:37:40
回答 5查看 2.2K关注 0票数 2

我正在尝试创建一个属性,它将从我的字节数组(byte[])创建一个指针( byte *),这确实有效,但是每当我修改这个返回的指针时,我的字节数组将不会被修改,这是我想要使用的一段代码。

代码语言:javascript
复制
public unsafe class PacketWriter
{
    private readonly byte[] _packet; 
    private int _position;

    public byte* Pointer
    {
        get
        {
            fixed (byte* pointer = _packet)
                return pointer;
        }
    }

    public PacketWriter(int packetLength)
    {
      _packet = new byte[packetLength];   
    }

    //An example function
    public void WriteInt16(short value)
    {
        if (value > Int16.MaxValue)
            throw new Exception("PacketWriter: You cannot write " + value + " to a Int16.");
        *((short*)(Pointer + _position)) = (short) value;
        _position += 2;
    }

    //I would call this function to get the array.
    public byte[] GetPacket
    {
        get { return _packet; }
    }
}

此外,我意识到我可以简单地删除属性并将代码放入函数中,这可能会起作用,但我正在试图找出使用该属性的方法-除非这会降低性能,在这种情况下请让我知道。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-12 22:05:40

在这里使用指针(在C#中)是没有意义的。

请注意,如果将Pointer属性替换为

代码语言:javascript
复制
public byte[] Data { get { return _packet; } }

您有一个返回对字节数组的引用的属性,它将允许您在数组中执行与指针相同的编辑操作,而无需在任何时候复制数组。

另一条建议,在你的Write16中,使用:

代码语言:javascript
复制
byte[] data = BitConverter.GetBytes(value);
data.CopyTo(_packet, _positiion);
_position += data.Length;
票数 6
EN

Stack Overflow用户

发布于 2010-10-12 21:40:04

当你的控件离开fixed时(它在返回后立即离开),你的对象不再被固定。所以它只在fixed内部有效

票数 2
EN

Stack Overflow用户

发布于 2010-10-12 22:27:13

不要暴露指针。你正在先发制人地优化你的代码。举个例子,我用C#为我正在做的一个项目写了一个PNG解码器,而不是假设瓶颈,我写的代码让管理数据结构变得微不足道,并且对I/O和数据移动相当轻松。在对代码进行基准测试时,瓶颈不在数据移动或I/O中,而是在Paeth预测器中-以像素为基础进行的计算(详细信息here)。

首先编写可读性和可维护性的代码,然后看看瓶颈在哪里。你可以在以后重构它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3915287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档