如何使用C / C ++可视化字节

时间:2009-05-28 11:58:46

标签: c++ c

我正在通过一些C ++培训。到目前为止一切顺利,但我需要一些帮助来加强我正在学习的一些概念。我的问题是如何可视化我创建的对象的字节模式。例如,我如何打印结构,长整数,整数等字节模式?

我理解它在我的脑海中,可以理解我的学习材料中的图表,我只是想能够在我的一些学习课程中以编程方式显示字节模式。

我意识到这是非常微不足道的,但任何答案都会帮助我理解这些概念。

感谢。

编辑:我主要使用XCode用于其他开发项目,但是有适用于Windows7和fedora核心的VM。在工作中我使用XP与visual studio 2005。 (我不能发表评论,因为我仍然是n00b:D)

我使用了unwind的解决方案,这是我正在寻找的。我也在想,也许我可以使用dos DEBUG命令,因为我也想查看块的内存。再次,这只是为了帮助我强化我正在学习的东西。再次感谢大家!

7 个答案:

答案 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。