在Python中将long从寄存器转换为char数组

时间:2014-02-14 20:47:37

标签: python linux memory-management

我正在使用他们在Python中的虚拟地址读取我的64位Linux机器上的内存寄存器。但是,我每个寄存器的输出(当然)是一个很长的值,例如282584257676671

我对PC架构有点困惑,我有一些问题:

  • 为什么这个长值15个位置(而不是16个?)
  • 32位架构中的长值是否有7个位置?
  • Linux内存页面(4kb)是(4096/64)= 64个寄存器的池吗?
  • Linux内存页面是否也有地址?
  • 最重要的是:如何将这个long转换为Python中的字符串以及该字符串需要多长时间?

谢谢!

编辑:

多数人可以用C做什么:

unsigned char dest[4];
unsigned long int l;
dest[0] = l         & 0xFF;
dest[1] = (l >>  8) & 0xFF;
dest[2] = (l >> 16) & 0xFF;
dest[3] = (l >> 24) & 0xFF;

如何在Python中执行此操作,并且我的char数组在64位arch中的大小是4吗?还是8?

2 个答案:

答案 0 :(得分:1)

是的,你可以在python中做同样的事情。

dest = [0] * 4
l = some_integer
dest[0] = l         & 0xFF
dest[1] = (l >>  8) & 0xFF
dest[2] = (l >> 16) & 0xFF
dest[3] = (l >> 24) & 0xFF

提出其他问题:

  
      
  • 为什么这个长值15个位置(而不是16个?)
  •   
  • 32位架构中的长值是否有7个位置?
  •   

因为你在这里看到的数字没有用0填充,唯一的答案就是它只要它需要它!例如,如果内存地址是42,当您以十进制打印时,它将是2位数。

此外,你需要注意你所谈论的基础。在十六进制中,64位整数可以用8位或更少的数字表示,如0xFFFFFFFF(每个字节两位)。在十进制中,64位整数可以用20位或更少的数字表示,如18446744073709551615

答案 1 :(得分:0)

回答你的最后一个问题(最重要的一个问题:D)。

l = 282584257676671
s = str(l)

print(s)

>>> 282584257676671

print(s[0])

>>> 2