簡體   English   中英

如何將字節數組轉換為 boost::multiprecision::uint128_t?

[英]How do I convert an array of bytes to a boost::multiprecision::uint128_t?

如果我有:

char buffer[16];

如何將其原始字節轉換為:

boost::multiprecision::uint128_t ?

我試着做一個標准的 C 風格的演員:

uint128_t myInt = *(uint128_t*)buffer;

雖然它似乎不能正常工作。 還嘗試使用 dynamic_cast

我找到了這個頁面: https : //www.boost.org/doc/libs/1_56_0/libs/multiprecision/doc/html/boost_multiprecision/tut/conversions.html

關於如何進行對話,但它似乎沒有涵蓋這種類型的事情。 有任何想法嗎?

編輯:建議使用 memcpy(如果它類似於 GCC 的 128 位 uint)將字節復制到 uint128_t 中的評論之一。 如果按照我期望的方式完成,這似乎無法正常工作: memcpy() 試試 我錯過了什么嗎?

我找到了一種基於 uint128_t 類型的動態特性來執行此操作的方法。 它似乎並不總是使用所有 16 個字節作為數值。 它僅在認為需要它們時才使用它們(這就是原始 memcpy() 不起作用的原因)。

所以訣竅是強制它認為需要所有 16 個字節,然后 memcpy() 數據。我們可以通過設置初始值 -1(或所有 Fs)來做到這一點:

boost::multiprecision::uint128_t getUintFromBuffer(const std::vector<unsigned char> &buf)
{
    boost::multiprecision::uint128_t retU = -1;
    memset(&retU, 0, 16);
    memcpy(&retU, buf.data(), std::min(buf.size(), (size_t)16));
    return retU;
}

int main()
{
    std::vector<unsigned char> buf;
    buf.resize(16);
    buf[0] = 0xaa;
    buf[15] = 0xff;

    std::cout << std::hex << getUintFromBuffer(buf) << std::endl;

    return EXIT_SUCCESS;
}

運行此示例打印: FF0000000000000000000000000000AA

這就是我一直在尋找的:)

我建議,可能是是你在找什么:

#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>
#include <iomanip>
#include <vector>
#include <iterator>

int main()
{
   using boost::multiprecision::cpp_int;
   // Create a cpp_int with just a couple of bits set:
   cpp_int i;
   bit_set(i, 5000); // set the 5000'th bit
   bit_set(i, 200);
   bit_set(i, 50);
   // export into 8-bit unsigned values, most significant bit first:
   std::vector<unsigned char> v;
   export_bits(i, std::back_inserter(v), 8);
   // import back again, and check for equality:
   cpp_int j;
   import_bits(j, v.begin(), v.end());
   assert(i == j);
}

我發現只使用boost::multiprecision::import_bits可以了。

template <unsigned Bits, boost::multiprecision::cpp_integer_type SignType,
          boost::multiprecision::cpp_int_check_type Checked>
boost::multiprecision::number<
    boost::multiprecision::cpp_int_backend<Bits, Bits, SignType, Checked, void>>
rawToBoost(const void *V) {
  using namespace boost::multiprecision;

#if BOOST_ENDIAN_BIG_BYTE
  static const auto msv_first = true;
#else
  static const auto msv_first = false;
#endif

  number<cpp_int_backend<Bits, Bits, SignType, Checked, void>> ret;
  auto VPtr = reinterpret_cast<const unsigned char *>(V);
  import_bits(ret, VPtr, VPtr + (Bits / 8), 0, msv_first);
  return ret;
}

boost::multiprecision::int128_t rawToBoost_int128(const void *V) {
  using namespace boost::multiprecision;
  return rawToBoost<128, signed_magnitude, unchecked>(V);
}

boost::multiprecision::int128_t rawToBoost_int128_safe(const void *V) {
  using namespace boost::multiprecision;
  return rawToBoost<128, signed_magnitude, checked>(V);
}

boost::multiprecision::uint128_t rawToBoost_uint128(const void *V) {
  using namespace boost::multiprecision;
  return rawToBoost<128, unsigned_magnitude, unchecked>(V);
}

boost::multiprecision::uint128_t rawToBoost_uint128_safe(const void *V) {
  using namespace boost::multiprecision;
  return rawToBoost<128, unsigned_magnitude, checked>(V);
}

這與 OP 提到的鏈接相同(但不同的增強版本)。 https://www.boost.org/doc/libs/1_62_0/libs/multiprecision/doc/html/boost_multiprecision/tut/ints/cpp_int.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM