如何有效地保留填充字节数组

时间:2014-07-30 04:06:46

标签: c# .net bytearray padding

假设我有一个数组

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

我这里有我当前的片段

        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];
        }

有更有效的方法吗?

3 个答案:

答案 0 :(得分:9)

我建议从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);

请注意,我没有检查您提供的阵列的长度 - 您应该注意它

答案 1 :(得分:4)

取决于您如何定义&#34;更高效&#34;那么这可能值得做:

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

这可能在计算上不是更有效,但在使代码清晰和可维护方面,您可能会认为这是一种有效的编码方式。

答案 2 :(得分:1)

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

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