尝试解码不在 base64 字符集中的值

2023-07-18C/C++开发问题
5

本文介绍了尝试解码不在 base64 字符集中的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我使用以下代码片段使用 Boost C++ 库对字符串进行 base64 编码和解码.

I am using the following code snippet to base64 encode and decode a string using Boost C++ library.

//Base64 Encode Implementation using Boost C++ library
const std::string base64_padding[] = {"", "=", "=="};

std::string X_Privet_Token_Generator::base64_encode(const std::string & s)
{
  namespace bai = boost::archive::iterators;

  std::stringstream os;

  // convert binary values to base64 characters
  typedef bai::base64_from_binary

  // retrieve 6 bit integers from a sequence of 8 bit bytes
  <bai::transform_width<const char *, 6, 8> > base64_enc; // compose all the above operations in to a new iterator

  std::copy(base64_enc(s.c_str()), base64_enc(s.c_str() + s.size()), std::ostream_iterator<char>(os));

  os << base64_padding[s.size() % 3];
  return os.str();
}

std::string X_Privet_Token_Generator::base64_decode(std::string & s)
{
  namespace bai = boost::archive::iterators;

  std::stringstream os;

  // convert binary values to base64 characters
  typedef bai::binary_from_base64

  <bai::transform_width<const char *, 8, 6> > base64_dec;

  unsigned int size = s.size();

  // Remove the padding characters, cf.
  if (size && s[size - 1] == '=')
  {
      --size;
      if (size && s[size - 1] == '=')
          --size;
  }

  if (size == 0)
      return std::string();

  LOGINFO("Hash decoded token : %s", s.c_str());
  std::copy(base64_dec(s.data()), base64_dec(s.data() + size), std::ostream_iterator<char>(os));
  std::cout<< os.str();
  return os.str();
}

编码效果很好,但是在解码时出现以下错误:

Encoding works well, however, while decoding I get the following error:

在抛出 boost::archive::iterators::dataflow_exception

what():尝试解码不在 base64 字符集中的值

what(): attempt to decode a value not in base64 char set

是否是导致此问题的填充字符之一?我在这里遗漏了什么吗?

Is it one of the padded characters that is causing this issue? Am I missing something here?

推荐答案

填充字符 '=' 是 b64 编码数据的一部分,在解码之前不应删除.b64 以 4 个字符的块进行编码,我怀疑在解码时它会在字符串末尾读取 '' 而不是预期的 '='.

The padding characters '=' are part of the b64 encoded data and should not be removed before decoding. b64 is encoded in blocks of 4 character, I suspect that while decoding it reads a '' instead of an expected '=' at the end of the string.

这篇关于尝试解码不在 base64 字符集中的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

无法访问 C++ std::set 中对象的非常量成员函数
Unable to access non-const member functions of objects in C++ std::set(无法访问 C++ std::set 中对象的非常量成员函数)...
2024-08-14 C/C++开发问题
17

从 lambda 构造 std::function 参数
Constructing std::function argument from lambda(从 lambda 构造 std::function 参数)...
2024-08-14 C/C++开发问题
25

STL BigInt 类实现
STL BigInt class implementation(STL BigInt 类实现)...
2024-08-14 C/C++开发问题
3

使用 std::atomic 和 std::condition_variable 同步不可靠
Sync is unreliable using std::atomic and std::condition_variable(使用 std::atomic 和 std::condition_variable 同步不可靠)...
2024-08-14 C/C++开发问题
17

在 STL 中将列表元素移动到末尾
Move list element to the end in STL(在 STL 中将列表元素移动到末尾)...
2024-08-14 C/C++开发问题
9

为什么禁止对存储在 STL 容器中的类重载 operator&amp;()?
Why is overloading operatoramp;() prohibited for classes stored in STL containers?(为什么禁止对存储在 STL 容器中的类重载 operatoramp;()?)...
2024-08-14 C/C++开发问题
6