【问题标题】:C - ntohl replacing digits with zero'sC - ntohl 用零替换数字
【发布时间】:2014-07-19 13:19:25
【问题描述】:

在以下关于 Little Endians 和 Big Endians 的程序中:

char *s = "1234";
printf("%08X\n",*(int *)s); //big endian
int little = ntohl(*s);
printf("%08X\n",little);//Little endian

我得到以下输出:

34333231
31000000

第二行的顺序应该与第一行相反。我究竟做错了什么? 我在 C 方面的经验很少,但在其他语言方面有一些经验。

【问题讨论】:

  • 您将 ASCII 字符串与整数表示混淆了
  • ASCII 值 1 是 0x31,这不是你看到结果的原因

标签: c endianness


【解决方案1】:

你需要这样的东西:

int little = ntohl(*((uint32_t*)s));

否则您只会将char 传递给ntohl,这就是您的值被截断的原因。

【讨论】:

  • 这是不正确的 - 字符串是字符串,int 是 int
  • @EdHeal:我相信 OP 出于学习目的故意滥用这些类型。他知道字符和整数之间的区别,并使用字符串作为查看反转字节的简单方法。
【解决方案2】:

你混淆了字符串和整数

uint32_t i = 12345;
printf("%08X\n", i);    /* 00003039 */
i = ntohl(i);
printf("%08X\n", i);    /* either 00003039 or 39300000 */

根据您平台的字节序,您可以得到相同的输出或按字节反转的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 2018-01-05
    • 1970-01-01
    • 2010-10-23
    • 2012-07-01
    相关资源
    最近更新 更多