首页 > 解决方案 > 在 C# 中将 (Javascript)TypedArray 字符串转换为 byteArray 的最佳方法

问题描述

我正在调用一个端点并返回一个格式string(JavaScript 中的 TypedArray),如下所示[12,44,36,132,22,19,99] ,并希望将该字符串转换回byte[].

我在用

var byteData = Regex.Replace(fileData, @"\[*\]*", "").Split(',').Select(x => byte.Parse(x)).ToArray();

但只是想知道是否有更优雅的方式来做到这一点?多谢你们

    protected void downloadFile(string fileKey)
    {
        var url = _apiFileDataUrl + fileKey;
        _filename = fileKey.Split('/').LastOrDefault();
        Log.Information($"Endpoint hit: {url}");

        var requestData = new HttpRequestMessage
        {
            Method = HttpMethod.Get,
            RequestUri = new Uri(url)
        };

        requestData.Headers.Add("X-Auth", _x_auth);
        requestData.Headers.Add("x-api-key", _x_api_key);
        //requestData.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

        var results = _client.SendAsync(requestData).Result;
        if (results.StatusCode != HttpStatusCode.OK)
        {
            throw new Exception($"Campaign failure at fileKey {fileKey} \n\n {(int)results.StatusCode}: {results.ReasonPhrase}");
        }

        var fileData = results.Content.ReadAsStringAsync().Result;
        if (fileData.Length > 0)
        {
            var byteData = Regex.Replace(fileData, @"\[*\]*", "").Split(',').Select(x => byte.Parse(x)).ToArray();
            //var byteData = fileData.Replace("[", "").Replace("]", "").Split(',').Select(x => byte.Parse(x)).ToArray();
            //var dt = DataTableHelper.CsvToDataTable(byteData, "\r\n",'|');
            File.WriteAllBytes(DataFilePath + _filename, byteData);
        }
    }

标签: javascriptc#arrays

解决方案


或多或少,我会走和你一样的路。但是,我不会Regex为这样一个简单的任务走这条路。我的代码在必要时被注释了。

    /// <summary>
    /// Creates a byte array from the passed TypedArray in javascript.
    /// </summary>
    /// <param name="jsStringArray">TypedArray in javascript, like [12, 44, 36, 132, 22, 19, 99]</param>
    /// <returns>Byte array created from passed string</returns>
    private static byte[] StringArrayToByteArrayParser(string jsStringArray ) {
        try{

            // // No need to use heavy Regex
            var sb = jsStringArray.Substring(1, jsStringArray.Length - 2);



            // Splits using , then converts into byte array
            return sb.ToString().Split(',').Select(byte.Parse).ToArray(); 
        }
        catch(ArgumentOutOfRangeException outOfRange) {
            // Handle etc..
            throw;
        }
        catch(Exception ex) {
            // Here catch your exceptions throw or handle
            throw;
        }

    }

推荐阅读