亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將字節數組轉換為一定長度的數組段

將字節數組轉換為一定長度的數組段

C#
ABOUTYOU 2022-01-09 10:52:02
我有一個字節數組,我想返回一定大小的順序塊(以新字節數組的形式)。我試過:originalArray = BYTE_ARRAYvar segment = new ArraySegment<byte>(originalArray,0,640); byte[] newArray = new byte[640];for (int i = segment.Offset; i <= segment.Count; i++){newArray[i] = segment.Array[i];}顯然,這只從原始數組創建了一個前 640 個字節的數組。最終,我想要一個遍歷前 640 個字節并返回這些字節數組的循環,然后遍歷下一個 640 個字節并返回一個 THOSE 字節數組。這樣做的目的是向服務器發送消息,每條消息必須包含 640 個字節。我不能保證原始數組長度可以被 640 整除。謝謝
查看完整描述

3 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

如果速度不是問題


var bytes = new byte[640 * 6];


for (var i = 0; i <= bytes.Length; i+=640)

{

   var chunk = bytes.Skip(i).Take(640).ToArray();

   ...

}

或者你可以使用


跨度切片法

Buffer.BlockCopy(Array, Int32, Array, Int32, Int32) 方法

跨度


Span<byte> bytes = arr; // Implicit cast from T[] to Span<T>


...


slicedBytes = bytes.Slice(i, 640);

塊復制


請注意,這可能是 3 個中最快的


var chunk = new byte[640]

Buffer.BlockCopy(bytes, i, chunk, 0, 640);


查看完整回答
反對 回復 2022-01-09
?
UYOU

TA貢獻1878條經驗 獲得超4個贊

如果您真的想從每個 640 字節塊中創建新數組,那么您正在尋找.Skip并且.Take


這是我一起破解的一個工作示例(以及示例的副本)。


using System;

using System.Linq;

using System.Text;

using System.Collections;

using System.Collections.Generic;


class MainClass {

public static void Main (string[] args) {

        // mock up a byte array from something

        var seedString = String.Join("", Enumerable.Range(0, 1024).Select(x => x.ToString()));

        var byteArrayInput = Encoding.ASCII.GetBytes(seedString);


        var skip = 0;

        var take = 640;

        var total = byteArrayInput.Length;


        var output = new List<byte[]>();


        while (skip + take < total) {

            output.Add(byteArrayInput.Skip(skip).Take(take).ToArray());

            skip += take;

        }


        output.ForEach(c => Console.WriteLine($"chunk: {BitConverter.ToString(c)}"));

    }

}

實際使用ArraySegment正確可能會更好——除非這是學習 LINQ 擴展的任務。


查看完整回答
反對 回復 2022-01-09
?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

你可以像這樣編寫一個通用的輔助方法:


public static IEnumerable<T[]> AsBatches<T>(T[] input, int n)

{

    for (int i = 0, r = input.Length; r >= n; r -= n, i += n)

    {

        var result = new T[n];

        Array.Copy(input, i, result, 0, n);

        yield return result;

    }

}

然后你可以foreach循環使用它:


byte[] byteArray = new byte[123456];


foreach (var batch in AsBatches(byteArray, 640))

{

    Console.WriteLine(batch.Length); // Do something with the batch.

}

或者,如果您想要批次列表,請執行以下操作:


List<byte[]> listOfBatches = AsBatches(byteArray, 640).ToList();

如果您想變得花哨,可以將其作為擴展方法,但僅在您將大量使用它時才建議這樣做(不要為您只會在一個地方調用的東西創建擴展方法?。?。


在這里,我更改了名稱InChunksOf()以使其更具可讀性:


public static class ArrayExt

{

    public static IEnumerable<T[]> InChunksOf<T>(this T[] input, int n)

    {

        for (int i = 0, r = input.Length; r >= n; r -= n, i += n)

        {

            var result = new T[n];

            Array.Copy(input, i, result, 0, n);

            yield return result;

        }

    }

}

你可以這樣使用:


byte[] byteArray = new byte[123456];


// ... initialise byteArray[], then:


var listOfChunks = byteArray.InChunksOf(640).ToList();

[編輯] 將循環終止符從 更正r > n為r >= n。


查看完整回答
反對 回復 2022-01-09
  • 3 回答
  • 0 關注
  • 216 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號