кодек ‘utf-8’ не может декодировать байт 0x80 в позиции 28: недопустимый начальный байт

#python #utf-8 #base64

#python #utf-8 #base64

Вопрос:

У меня есть файл wav, который я преобразовал в двоичный файл, а затем изменил его на base64 с помощью C #, а затем отправил эту строку base64 в API-интерфейс python flask, чтобы я мог ее декодировать и изменить строку base64 обратно в файл wav, чтобы я мог сохранить в папке, я получаю эту ошибку ниже:

кодек ‘utf-8’ не может декодировать байт 0x80 в позиции 28: недопустимый начальный байт

Пожалуйста, посмотрите мой код ниже:

 public static void copy_to_watch_folder(string filepath, string filename)
        {
            try
            {
                AppDomain.CurrentDomain.SetPrincipalPolicy(System.Security.Principal.PrincipalPolicy.WindowsPrincipal);
                var destinationFolder = SSKAccess.mapped_dir_path;
                byte[] audio_file = File.ReadAllBytes(filepath);

                var s = Convert.ToBase64String(audio_file);

                string jsonData = JsonConvert.SerializeObject(new { Result = "OK", File = s, FileName = filename, token= SSKAccess.token }, Formatting.None);

                StringContent sC2 = new StringContent(jsonData, System.Text.Encoding.UTF8, "application/json");

                HttpClient client = new HttpClient();

                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                client.BaseAddress = new Uri(ConnectionSetup.connectionStr);

                try
                {
                    var response = client.PostAsync("putWavFile", sC2).Resu<

                    if (response.IsSuccessStatusCode)
                    {
                        Logs.WriteToFile($"{ DateTime.Now } : {response.Content.ReadAsStringAsync()}");
                    }
                }
                catch (Exception exc)
                {
                    Logs.WriteToFile($"HttpError : {exc.Message}");
                }

                //System.IO.File.Copy(filepath, $"{destinationFolder}{filename}", true);
            }
            catch (IOException copyError)
            {
                Logs.WriteToFile($"{DateTime.Now} - CopyError: {copyError.Message}");
            }

        }
 

Мой код на Python выглядит так:

 @app.route('/api/Call/putWavFile', methods=['POST'])
def PutWavFile():
    if not request.json or not 'token' in request.json: 
        abort(400)
    
    try:
        filename = request.json['FileName']
        binaryData = request.json['File'] 

        file_decoded = base64.decodebytes(binaryData.encode('utf-8').strip())

        _file = file_decoded.decode()
        path_to_save = os.path.join(os.getcwd(), 'Watch', filename)
        with open(path_to_save, mode='wb') as f:
            f.write(file_decoded)

        return jsonify({"FileCreated": "Success"})
    except Exception as exc:
        print(f"FileError: {str(exc)}")
        return jsonify( {"Error": f"{str(exc)}"} )
 

Пожалуйста, помогите и заранее спасибо.

Комментарии:

1. Привет, строка, вызывающая эту ошибку: file_decoded = base64.decodebytes(binaryData.encode(‘utf-8’).strip())

2. Я не уверен в python. Однако вы проверили, что полезная нагрузка выглядит так, как вы ожидаете?

3. Да, я отображал его на своем терминале, получая значения с помощью request.json [‘File’] и request.json [‘FileName’], и другое дело, что если я удаляю кодирование и декодирование base64, я получаю wav-файл, но он не может воспроизводиться, поэтому я предположил, что мойбайт поврежден или что-то в этом роде, поэтому я решил использовать строку base64 для отправки байта в мой API.

4. Но откуда вы получили ошибку? file_decoded это двоичный волновой файл, поэтому _file = file_decoded.decode() он должен вызывать ошибку. Просто удалите эту строку.

Ответ №1:

Спасибо всем за вашу помощь, но, наконец, я получил решение. Оказывается, все, что мне было нужно, это следующая строка для декодирования строки base64, поступающей из моего вызова C # API:

 file_decoded = base64.b64decode(binaryData)
 

Еще раз спасибо тем, кто пытался помочь.