hageking
@hageking

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

c++でpythonのto_bytesと同じことがしたい

解決したいこと

pythonのto_bytes(8, 'big')をc++で実装したいです。

>>> a = 100
>>> a.to_bytes(8, 'big')
b'\x00\x00\x00\x00\x00\x00\x00d'

このようなことをC++でやりたいです。
わかる方、回答お願いします。
もしC++で実装できないのであれば代わりの方法などを教えてくれると嬉しいです。

0

1Answer

質問は何ですか?
実装するにあたってあなたがわからないことは何ですか?

「同じこと」というのがシリアライズなのか、バイト列への変換なのか、表示の形式のことなのかが自明でないのでかなりおおざっぱに雰囲気でコードを書いてみたのですがやりたいのはこういうことなんでしょうか? (符号なし整数型のみにしか対応していません。)

#include <array>
#include <cstddef>
#include <iostream>
#include <limits>
#include <type_traits>

enum class endian : int {
    little,
    big
};

template <class T>
typename std::enable_if<std::is_unsigned<T>::value, std::array<unsigned char, sizeof(T)>>::type to_bytes(T x, endian e) {
    std::array<unsigned char, sizeof(T)> serialized;
    if (e == endian::little) {
        for (std::size_t i = 0; i < sizeof(T); ++i) {
            serialized[i] = x % (std::numeric_limits<char>::max() + 1);
            x /= (std::numeric_limits<char>::max() + 1);
        }
    } else if (e == endian::big) {
        for (std::size_t i = 0; i < sizeof(T); ++i) {
            serialized[sizeof(T) - i - 1] = x % (std::numeric_limits<char>::max() + 1);
            x /= (std::numeric_limits<char>::max() + 1);
        }
    }
    return serialized;
}

template <class T, std::size_t N>
typename std::enable_if<std::is_unsigned<T>::value, std::ostream&>::type
operator<<(std::ostream& os, const std::array<T, N>& obj) {
    for(auto x: obj) {
        os << (int)x << ' ';
    }
    return os;
}

int main(void) {
    std::cout << to_bytes(8U, endian::big) << std::endl;
}
2Like

Comments

  1. @hageking

    Questioner

    C++初心者なのでもう一度勉強します。
    回答ありがとうございました。

Your answer might help someone💌