我正在通过一些C ++培训。到目前为止一切顺利,但我需要一些帮助来加强我正在学习的一些概念。我的问题是如何可视化我创建的对象的字节模式。例如,我如何打印结构,长整数,整数等字节模式?
我理解它在我的脑海中,可以理解我的学习材料中的图表,我只是想能够在我的一些学习课程中以编程方式显示字节模式。
我意识到这是非常微不足道的,但任何答案都会帮助我理解这些概念。
感谢。
编辑:我主要使用XCode用于其他开发项目,但是有适用于Windows7和fedora核心的VM。在工作中我使用XP与visual studio 2005。 (我不能发表评论,因为我仍然是n00b:D)
我使用了unwind的解决方案,这是我正在寻找的。我也在想,也许我可以使用dos DEBUG命令,因为我也想查看块的内存。再次,这只是为了帮助我强化我正在学习的东西。再次感谢大家!
答案 0 :(得分:24)
您可以使用此类函数来打印字节:
void print_bytes(const void *object, size_t size)
{
// This is for C++; in C just drop the static_cast<>() and assign.
const unsigned char * const bytes = static_cast<const unsigned char *>(object);
size_t i;
printf("[ ");
for(i = 0; i < size; i++)
{
printf("%02x ", bytes[i]);
}
printf("]\n");
}
用法看起来像这样,例如:
int x = 37;
float y = 3.14;
print_bytes(&x, sizeof x);
print_bytes(&y, sizeof y);
这显示的字节就像原始数值一样,以十六进制表示,通常用于这类“内存转储”。
在运行“Intel(R)Xeon(R)”CPU的随机(可能甚至是虚拟的,据我所知)Linux机器上打印:
[ 25 00 00 00 ] [ c3 f5 48 40 ]
这也很方便地证明了英特尔CPU系列的确是little endian。
答案 1 :(得分:5)
如果您使用的是gcc和X,则可以使用DDD debugger为您绘制数据结构的精美图片。
答案 2 :(得分:3)
为了完整起见,一个C ++示例:
#include <iostream>
template <typename T>
void print_bytes(const T& input, std::ostream& os = std::cout)
{
const unsigned char* p = reinterpret_cast<const unsigned char*>(&input);
os << std::hex << std::showbase;
os << "[";
for (unsigned int i=0; i<sizeof(T); ++i)
os << static_cast<int>(*(p++)) << " ";
os << "]" << std::endl;;
}
int main()
{
int i = 12345678;
print_bytes(i);
float x = 3.14f;
print_bytes(x);
}
答案 3 :(得分:1)
大多数(可视)调试器都有一个“View Memory”选项.IIRC中的Xcode是非常基本的,只显示HEX和ASCII中的字节,行长可变.Visual Studio(Debug-&gt; Windows-&gt; Vs2008中的内存)可以将十六进制部分格式化为不同的整数长度,或浮点,更改字节顺序,并显示ANSI或UNICODE文本。您还可以设置几乎任何数字的窗口宽度(我认为xcode只允许你转到64字节宽)我在这里工作的另一个IDE有很多选项,但不像VS那么多。
答案 4 :(得分:0)
或者,如果您有boost lib并且想要使用lambda评估,您可以这样做......
template<class T>
void bytePattern( const T& object )
{
typedef unsigned char byte_type;
typedef const byte_type* iterator;
std::cout << "Object type:" << typeid( T ).name() << std::hex;
std::for_each(
reinterpret_cast<iterator>(&object),
reinterpret_cast<iterator>(&object) + sizeof(T),
std::cout << constant(' ') << ll_static_cast<int>(_1 )&&0xFF );
std::cout << "\n";
}
答案 5 :(得分:0)
我逐渐调动了一点控制台程序,希望它对某人有帮助
#include <iostream>
#include <inttypes.h>
#include <vector>
using namespace std;
typedef vector<uint8_t> ByteVector;
///////////////////////////////////////////////////////////////
uint8_t Flags[8] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void print_bytes(ByteVector Bv){
for (unsigned i = 0; i < Bv.size(); i++){
printf("Byte %d [ ",i);
for (int j = 0;j < 8;++j){
Bv[i] & Flags[j] ? printf("1") : printf("0");
}
printf("]\n");
}
}
int main(){
ByteVector Bv;
for (int i = 0; i < 4; ++i) { Bv.push_back(i); }
print_bytes(Bv);
}
答案 6 :(得分:-2)
试试这个:
MyClass* myObj = new MyClass();
int size=sizeof(*myObj);
int i;
char* ptr = obj; // closest approximation to byte
for( i=0; i<size; i++ )
std::cout << *ptr << endl;
干杯,
JRH。