如何有效地填充字节数组

Posted

技术标签:

【中文标题】如何有效地填充字节数组【英文标题】:How do I left pad a byte array efficiently 【发布时间】:2014-09-21 14:38:34 【问题描述】:

假设我有一个数组

LogoDataBy
byte[0x00000008]
    [0x00000000]: 0x41
    [0x00000001]: 0x42
    [0x00000002]: 0x43
    [0x00000003]: 0x44
    [0x00000004]: 0x31
    [0x00000005]: 0x32
    [0x00000006]: 0x33
    [0x00000007]: 0x34

我想创建一个任意长度的数组并用0x00填充它

newArray
byte[0x00000010]
    [0x00000000]: 0x00
    [0x00000001]: 0x00
    [0x00000002]: 0x00
    [0x00000003]: 0x00
    [0x00000004]: 0x00
    [0x00000005]: 0x00
    [0x00000006]: 0x00
    [0x00000007]: 0x00
    [0x00000008]: 0x41
    [0x00000009]: 0x42
    [0x0000000a]: 0x43
    [0x0000000b]: 0x44
    [0x0000000c]: 0x31
    [0x0000000d]: 0x32
    [0x0000000e]: 0x33
    [0x0000000f]: 0x34

我这里有我当前的 sn-p

        string test = "ABCD1234";
        byte[] LogoDataBy = ASCIIEncoding.ASCII.GetBytes(test);
        var newArray = new byte[16];

        var difference = newArray.Length - LogoDataBy.Length;

        for (int i = 0; i < LogoDataBy.Length; i++)
        
            newArray[difference + i] = LogoDataBy[i];
        

有没有更有效的方法来做到这一点?

【问题讨论】:

是的 - 如果你真的需要高效,请使用 Array.CopyBuffer.BlockCopy 【参考方案1】:

我建议像这样以Array.Copy 开头:

string test = "ABCD1234";
byte[] LogoDataBy = ASCIIEncoding.ASCII.GetBytes(test);
var newArray = new byte[16];

var startAt = newArray.Length - LogoDataBy.Length;
Array.Copy(LogoDataBy, 0, newArray, startAt, LogoDataBy.Length);

如果你真的需要速度,你也可以Buffer.BlockCopy

string test = "ABCD1234";
byte[] LogoDataBy = ASCIIEncoding.ASCII.GetBytes(test);
var newArray = new byte[16];

var startAt = newArray.Length - LogoDataBy.Length;
Buffer.BlockCopy(LogoDataBy, 0, newArray, startAt, LogoDataBy.Length);

请注意,我没有检查您提供的数组的长度 - 您应该注意它是否足够

【讨论】:

从您的回答开始,我编写了一个参数函数来执行此操作。链接在这里:programmingistheway.wordpress.com/2016/02/24/…【参考方案2】:

根据您如何定义“更高效”,这可能是值得的:

var newArray =
    Enumerable
        .Repeat<Byte>(0, 16 - LogoDataBy.Length)
        .Concat(LogoDataBy)
        .ToArray();

这在计算上可能效率不高,但就使代码清晰和可维护而言,您可能会认为这是一种高效的编码方式。

【讨论】:

如果我正在编写网络代码,我会更喜欢@Carsten 的回答。如果我正在编写应用程序级程序,我会更喜欢你的方法。 为什么不var newArray = new byte[16 - LogoDataBy.Length].Concat(LogoDataBy).ToArray();【参考方案3】:

您可以使用其他一些GetBytes 的重载。其中之一允许您指定数组中的起始索引:http://msdn.microsoft.com/en-us/library/595a8te7%28v=vs.110%29.aspx

您可以在编码类上使用GetByteCount 方法来获取编码后将存在的字节数,尽管添加此额外调用可能会抵消任何性能优势。您可能知道字节数与字符串长度完全匹配(取决于您的字符串源)。

【讨论】:

以上是关于如何有效地填充字节数组的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中有效地将字符串转换为字节数组(不使用编码)[重复]

如何检查字节数组是不是为有效的pdf文件[关闭]

如何有效地将 BSTR 复制到 wchar_t[]?

十六进制枚举或整数(ASCII)枚举来填充字节数组?

从字节数组填充音频缓冲区并使用渲染回调播放

如何在golang中将字节附加到字节数组?不是字节数组到字节数组切片等[重复]