【问题标题】:How to cast a array of char in an integer which represent the ascii value of it?如何将 char 数组转换为表示它的 ascii 值的整数?
【发布时间】:2011-11-21 00:27:32
【问题描述】:

我有一个由 4 个字符组成的数组,我需要一个数字中的他的 ascii 值。 例如在数组中是"joh0"。结果应为十六进制 0x6a726f00 或 int 111617776。 我在函数ntohl(int x)中使用它。

【问题讨论】:

  • 您确定 111617776 不应该“读取”1785884416 吗?由于 111617776 等于 0x6a726f0,所以在我看来,从十六进制转换为十进制时,您只是忘记了尾随的 0。

标签: c ascii


【解决方案1】:

根据您的描述,这听起来像是您想要的(可能交换了索引):

char str[] = "joh0";

uint32_t val = (uint32_t)str[0]
             | (uint32_t)str[1] << 8
             | (uint32_t)str[2] << 16
             | (uint32_t)str[3] << 24;

但我不知道你从哪里得到 106111104048。

【讨论】:

  • 您确定不必先转换为unsigned char吗?我记得这是个大问题...我会说unsigned char * p = str; 并从那里开始...
  • @KerrekSB:如果 OP 使用标准 ASCII 范围之外的字符,那么是的。
  • 啊,很好地理解了“ASCII”的要求! :-)(我倾向于忽略这一点,因为几乎没有人真正意义上使用它......)
【解决方案2】:

我认为您是通过这种方式获取样本编号的:

Decimal:   106 111 104 048
Character: j   o   h   0

如果是这种情况,您的数字将不适合 32 位整数值。您需要使用更大的数据类型,例如uint64_tunsigned long long。您需要以下内容:

const char str[] = "joh0";

unsigned long long result = ((unsigned long long)str[0])
                          + ((unsigned long long)str[1] * 1000LLU)
                          + ((unsigned long long)str[2] * 1000000LLU)
                          + ((unsigned long long)str[3] * 1000000000LLU);

【讨论】:

    猜你喜欢
    • 2017-12-23
    • 2020-05-22
    • 2018-03-27
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 2020-01-22
    • 2017-06-27
    相关资源
    最近更新 更多