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
pythonのto_bytes(8, 'big')
をc++で実装したいです。
>>> a = 100
>>> a.to_bytes(8, 'big')
b'\x00\x00\x00\x00\x00\x00\x00d'
このようなことをC++でやりたいです。
わかる方、回答お願いします。
もしC++で実装できないのであれば代わりの方法などを教えてくれると嬉しいです。
質問は何ですか?
実装するにあたってあなたがわからないことは何ですか?
「同じこと」というのがシリアライズなのか、バイト列への変換なのか、表示の形式のことなのかが自明でないのでかなりおおざっぱに雰囲気でコードを書いてみたのですがやりたいのはこういうことなんでしょうか? (符号なし整数型のみにしか対応していません。)
#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;
}
@hageking
Questioner