对于不从 0 开始的缓冲区,是否有一种不那么痛苦的 GetBytes 方法?
我必须处理项目中的原始字节,我基本上需要做这样的事情,
byte[] ToBytes(){
byte[] buffer=new byte[somelength];
byte[] tmp;
tmp=BitConverter.GetBytes(SomeShort);
buffer[0]=tmp[0];
buffer[1]=tmp[1];
tmp=BitConverter.GetBytes(SomeOtherShort);
buffer[2]=tmp[0];
buffer[3]=tmp[1];
}
我觉得这是非常错误的,但我找不到任何更好的方法来做到这一点。有更简单的方法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
BinaryWriter 非常高效:
BinaryWriter is very efficient:
您不需要将
tmp
初始化为新数组。BitConverter.GetBytes
创建一个新数组并为您返回它。对于GetBytes
您无能为力,但您可以使用Buffer.BlockCopy
来简化复制操作。如果您不是在性能关键的代码段中执行此操作,则可以使用一点 LINQy 并执行以下操作:
You don't need to initialize
tmp
to a new array.BitConverter.GetBytes
creates a new array and returns it for you. There's not much you can do aboutGetBytes
but you can use methods likeBuffer.BlockCopy
to simplify the copy operation.If you're not doing this in a performance-critical piece of code, you can go a bit LINQy and do things like:
如果您事先知道大小(有一组值类型),则可以使用结构体并在结构体中分配值。然后使用
不安全
代码复制原始字节。我仍然建议不要这样做,除非出于速度目的确实有必要。你可能会认为这很痛苦:)If you know the size beforehand (have a set of value types) you could use a struct and assign your values in the struct. Then use
unsafe
code to copy the raw bytes. I would still advise against it unless it's really necessary for speed purposes. And you might think it's painful :)只是位移位...
这也意味着您可以完全控制字节序(在本例中为小字节序)
Just bit-shift...
This also means you are in complete control of the endian-ness (in this case, little-endian)
您可以使用 Array.Copy 使代码稍微短一些,但是 BitConverter 中没有任何 GetBytes 重载或等效函数将字节直接放入缓冲区。
也许 BinaryWriter 在 MemoryStream 是您想要的吗?
请注意,如果采用您不喜欢的 BitConverter API 约定,则会给您的班级用户带来同样的问题。相反,编写一个接受 BinaryWriter 并将您的类序列化到其中的方法,当您的类嵌入到其他对象中时,这可以很好地扩展。
You can make your code a little shorter by using Array.Copy, but no there isn't any GetBytes overload or equivalent in BitConverter that puts the bytes directly into your buffer.
Maybe BinaryWriter on a MemoryStream is what you want?
Note that by adopting the API conventions of BitConverter which you don't like, you're causing the same problem for users of your class. Instead, write a method which accepts a BinaryWriter and serializes your class into it, this extends nicely when your class is embedded in some other object.