V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jseanj
V2EX  ›  程序员

请教一个问题:在程序中怎样得到一个变量的二进制数据

  •  
  •   jseanj · 2013-10-14 16:27:23 +08:00 · 2951 次点击
    这是一个创建于 4057 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如在c中,想得到一个int的二进制可以通过itoa,但是这是通过程序计算得到的,我想知道是否有直接读取内存地址上二进制数据的系统接口?

    ps:通过gdb的x命令可以查看内存数据,我觉得这是最接近底层的了。
    16 条回复    1970-01-01 08:00:00 +08:00
    9hills
        1
    9hills  
       2013-10-14 16:46:18 +08:00
    itoa不是返回二进制。。它是把二进制转换为字符串给你看得
    Kabie
        2
    Kabie  
       2013-10-14 16:50:33 +08:00
    C获取指针然后就随便玩了。。。当然你得知道存储方式。。。其他语言估计就难了……
    66450146
        3
    66450146  
       2013-10-14 16:51:53 +08:00
    直接使用这个变量就是使用它的二进制数据啊。。。。
    jseanj
        4
    jseanj  
    OP
       2013-10-14 17:05:46 +08:00
    @9hills 是的,它是将二进制数据存放在字符数组中返回的,但是我想看的是实际存储的二进制,也就是一个bit的值,而非一个byte的值
    jseanj
        5
    jseanj  
    OP
       2013-10-14 17:08:18 +08:00
    @Kabie
    @66450146
    比如int,程序显示给我们的是以4个字节为单位来显示的,而不是以32个bit为单位来显示的,我想知道是否有接口可以取出32个bit,而非用程序计算的方式算出来
    wjchen
        6
    wjchen  
       2013-10-14 17:11:53 +08:00
    struct a
    {
    int a1 :1;
    int a2:1;
    .....
    int a32:1;
    };
    这样?将int用memcpy拷贝到结构体。
    9hills
        7
    9hills  
       2013-10-14 17:20:39 +08:00
    @jseanj Google C 位运算

    C的位运算已经是最底层了,没法再低
    jseanj
        8
    jseanj  
    OP
       2013-10-14 17:21:33 +08:00
    @wjchen memcpy不是拷贝起始位置的n个字节吗?不是n个bit位
    Kabie
        9
    Kabie  
       2013-10-14 17:23:02 +08:00
    @wjchen 不用复制……直接类型转换就行了……
    jseanj
        10
    jseanj  
    OP
       2013-10-14 17:23:43 +08:00
    @9hills 那看来是真没有了,除非汇编了
    ddaii
        11
    ddaii  
       2013-10-14 17:29:53 +08:00
    @jseanj 在c语言中定义的各种类型其实都只是定义一块内存区域的操作方式而已,所以无论是int,char,float,double,你需要用一个指针就可以把它读取出来了,这并不需要什么系统接口。
    Golevka
        12
    Golevka  
       2013-10-14 17:30:58 +08:00   ❤️ 2
    @jseanj 啊哈哈哈哈哈哈哈你真的知道自己究竟想要什么吗?

    另外注意一下如果你在userspace下那么你能摸到的大部分地址都不是等值映射的, 所以如果你想访问真正的物理地址那么还得找别的办法=w=
    jseanj
        13
    jseanj  
    OP
       2013-10-14 17:35:56 +08:00
    @Golevka 我想要的就是看有没有接口能直接读取二进制数据
    jseanj
        14
    jseanj  
    OP
       2013-10-14 17:40:15 +08:00
    @ddaii 确实如你所说,每种类型其实就是定义数据的方式罢了,01序列通过定义方式的不同显示的也不一样。即使程序具备这种接口也是没什么必要的。
    jedyu
        15
    jedyu  
       2013-10-14 17:53:32 +08:00
    自己写个函数,遍历每一位&一下
    msg7086
        16
    msg7086  
       2013-10-15 02:09:35 +08:00   ❤️ 1
    @jseanj 所以其实你完全不知道你到底要什么。

    任何数字都只是数字,当你提到二进制或者十进制的时候,都是在提这个数字的字符串表示,也就是你在顶楼里写的itoa的作用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2776 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:51 · PVG 21:51 · LAX 05:51 · JFK 08:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.