【问题标题】:How can I change char array to int using C?如何使用 C 将 char 数组更改为 int?
【发布时间】:2012-07-17 12:57:12
【问题描述】:

我现在正在学习 C,我正在解析一个原始注册表文件并阅读它。

我现在有一些问题,

000011E0    00 00 00 00 60 01 00 00 B9 01 00 00 00 00 00 00 
000011F0    20 C0 26 00 FF FF FF FF 00 00 00 00 FF FF FF FF 
00001200    10 FC 00 00 FF FF FF FF 4C 00 01 00 00 00 00 00
this is hex value of REGISTRY file.

fseek(fp,0x11F0,SEEK_SET);

char tmp[4];
int now = ftell(fp);
for(int i = 0 ; i < 4 ; i++){
    tmp[i] = fgetc(fp);
    }

我制作了这个 tmp 数组,但我需要 0x0026c020。 如何将此数组更改为该值?或者请建议我更好的算法。

谢谢。

【问题讨论】:

    标签: c


    【解决方案1】:

    如果您知道值以与主机操作系统架构相同的字节顺序存储,您可以这样做:

    int value = *(int *)tmp;
    

    但是,您应该像这里那样以倒序读取字节——这会改变字节顺序并导致错误的值。试试这个:

    int value;
    if (fread(&value, sizeof(value), 1, fp) != 1) {
        /* Could not read, handle error. */
    }
    
    /* value is set, inspect it */
    

    【讨论】:

    • 非常感谢!如果 endian 不同呢?
    • 那你首先需要确定两件事:数据的字节序是什么,主机的字节序是什么?如果一个大一个小,做一个字节交换。标准的 4 字节交换习惯用法是:value = ((value &amp; 0xffu) &lt;&lt; 24) | ((value &amp; 0xff00u) &lt;&lt; 8) | ((value &amp; 0xff0000u) &gt;&gt; 8) | ((value &amp; 0xff000000u) &gt;&gt; 24);
    • 或者不是制作自己的函数,而是在创建数组时使用网络函数 htonl() 并在读取数组时使用 ntohl()/ 无论字节序匹配还是如果您使用的是网络顺序/大端系统(不是 x86),则不会,也不会执行任何操作。好吧,我猜你不写值,但你仍然可以在阅读时使用 ntohl() 或朋友
    • @SethRobertson 但在这种情况下,存储看起来是 little-endian -- not 网络顺序。 htonl/ntohl 将交换 little-endian 而不会交换 big-endian - 与 OP 可能需要的完全相反。而且,注册表中的存储可能依赖于主机 CPU,因此在任何一种情况下都不需要交换。
    【解决方案2】:

    要将字符串转换为整数,已经有可用的函数,其中一个是 strtoul().

    您可以使用标准的 strtoul() 函数将字符串转换为整数值。

    【讨论】:

      猜你喜欢
      • 2017-02-19
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 2014-08-20
      • 2023-01-13
      • 2020-11-12
      相关资源
      最近更新 更多