【问题标题】:Best way to convert a string of (Javascript)TypedArray to byteArray in C#在 C# 中将 (Javascript)TypedArray 字符串转换为 byteArray 的最佳方法
【发布时间】:2020-02-08 11:37:06
【问题描述】:

我正在调用一个端点并返回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);
        }
    }

【问题讨论】:

  • 这只是用空字符串替换“[]”吗? Regex.Replace(fileData, @"[]", "") 我无法想象您会将 [[]] 或类似的东西发送到服务器的情况。除此之外,其余的对我来说都很好

标签: javascript c# arrays


【解决方案1】:

或多或少,我会走和你一样的路。但是,对于这样一个简单的任务,我不会选择 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;
        }

    }

【讨论】:

  • 不需要创建StringBuilder的实例,因为string本身就有Remove,可以直接在jsStringArray上使用。或者,更简单的是,您可以使用 jsStringArray.Substring(1, jsStringArray.Length - 2)
  • @Herohtar,我完全错过了子字符串。
猜你喜欢
  • 1970-01-01
  • 2018-05-28
  • 2014-06-21
  • 2010-10-21
  • 2014-01-28
  • 2010-10-10
  • 2011-08-11
相关资源
最近更新 更多