首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BitConverter.GetBytes就位

BitConverter.GetBytes就位
EN

Stack Overflow用户
提问于 2014-04-14 10:04:04
回答 6查看 3K关注 0票数 4

我需要将UInt16UInt64中的值作为Byte[]。目前我正在使用BitConverter.GetBytes,但是这个方法每次都给我一个新的数组实例。

我想使用一种方法,允许我将这些值“复制”到已经存在的数组,如下所示:

代码语言:javascript
复制
.ToBytes(UInt64 value, Byte[] array, Int32 offset);
.ToBytes(UInt16 value, Byte[] array, Int32 offset);

我一直在查看带有.NET的ILSpy源代码,但我不太确定这段代码是如何工作的,以及如何安全地修改它以满足我的要求:

代码语言:javascript
复制
public unsafe static byte[] GetBytes(long value)
{
    byte[] array = new byte[8];
    fixed (byte* ptr = array)
    {
            *(long*)ptr = value;
    }
    return array;
}

哪种方式才是实现这一目标的正确途径?

更新:我不能使用不安全的代码。它不应该创建新的数组实例。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-04-14 10:15:14

你可以这样做:

代码语言:javascript
复制
static unsafe void ToBytes(ulong value, byte[] array, int offset)
{
    fixed (byte* ptr = &array[offset])
        *(ulong*)ptr = value;
}

用法:

代码语言:javascript
复制
byte[] array = new byte[9];
ToBytes(0x1122334455667788, array, 1);

只能以字节为单位设置偏移量。

如果你想要有管理的方式去做这件事:

代码语言:javascript
复制
static void ToBytes(ulong value, byte[] array, int offset)
{
    byte[] valueBytes = BitConverter.GetBytes(value);
    Array.Copy(valueBytes, 0, array, offset, valueBytes.Length);
}

或者你可以自己填值:

代码语言:javascript
复制
static void ToBytes(ulong value, byte[] array, int offset)
{
    for (int i = 0; i < 8; i++)
    {
        array[offset + i] = (byte)value;
        value >>= 8;
    }
}
票数 8
EN

Stack Overflow用户

发布于 2020-01-13 08:31:07

既然.NET添加了Span<T>支持,以便更好地处理数组、非托管内存等而不需要过多的分配,那么他们还添加了System.Buffer.Binary.BinaryPrimitives

这是您想要的,例如WriteUInt64BigEndian有这样的签名:

代码语言:javascript
复制
public static void WriteUInt64BigEndian (Span<byte> destination, ulong value);

这就避免了分配。

票数 4
EN

Stack Overflow用户

发布于 2014-04-14 10:27:40

您说要避免创建新数组,并且不能使用不安全。要么使用Ulugbek Umirov对缓存数组的回答(注意线程问题),要么:

代码语言:javascript
复制
static void ToBytes(ulong value, byte[] array, int offset) {
 unchecked {
  array[offset + 0] = (byte)(value >> (8*7));
  array[offset + 1] = (byte)(value >> (8*6));
  array[offset + 2] = (byte)(value >> (8*5));
  array[offset + 3] = (byte)(value >> (8*4));
  //...
 }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23057284

复制
相关文章

相似问题

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