【问题标题】:how to convert base10 decimal (big endian) to binary ( a hex in little endian) in a char array [closed]如何在char数组中将base10十进制(大端)转换为二进制(小端中的十六进制)[关闭]
【发布时间】:2013-03-11 11:55:25
【问题描述】:

我在 iOS 中遇到了一些问题。 我一直在尝试将 base10 十进制值转换为 little endianhexadecimal 字符串。

到目前为止,我无法这样做。

例如我想将以下整数转换为little endian十六进制:

int val = 11234567890123456789112345678911;

【问题讨论】:

  • 该值不适合整数。 (有符号 32 位整数或无符号 32 位整数)
  • 它也没有基数或字节序。这只是一个值。
  • hmm... 我在 python 中找到了类似于我想要的东西,虽然我不知道如何将它转换为 C 或目标 C:>>> n = int("11234567890123456789112345678911", 10) > >> out = [] >>> for i in range(32): ... out.append(n & 0xff) ... n >>= 8 ... >>> ''.join([chr( x) for x in out]).encode('hex')

标签: c hex decimal endianness


【解决方案1】:

你可以这样做:

#include <stdio.h>
#include <string.h>

void MulBytesBy10(unsigned char* buf, size_t cnt)
{
  unsigned carry = 0;
  while (cnt--)
  {
    carry += 10 * *buf;
    *buf++ = carry & 0xFF;
    carry >>= 8;
  }
}

void AddDigitToBytes(unsigned char* buf, size_t cnt, unsigned char digit)
{
  unsigned carry = digit;
  while (cnt-- && carry)
  {
    carry += *buf;
    *buf++ = carry & 0xFF;
    carry >>= 8;
  }
}

void DecimalIntegerStringToBytes(unsigned char* buf, size_t cnt, const char* str)
{
  memset(buf, 0, cnt);

  while (*str != '\0')
  {
    MulBytesBy10(buf, cnt);
    AddDigitToBytes(buf, cnt, *str++ - '0');
  }
}

void PrintBytesHex(const unsigned char* buf, size_t cnt)
{
  size_t i;
  for (i = 0; i < cnt; i++)
    printf("%02X", buf[cnt - 1 - i]);
}

int main(void)
{
  unsigned char buf[16];

  DecimalIntegerStringToBytes(buf, sizeof buf, "11234567890123456789112345678911");

  PrintBytesHex(buf, sizeof buf); puts("");

  return 0;
}

输出(ideone):

0000008DCCD8BFC66318148CD6ED543F

将生成的字节转换为十六进制字符串(如果这是您想要的)应该很简单。

【讨论】:

    【解决方案2】:

    除了其他问题(其他人已经指出,所以我不会重复),如果您确实需要交换字节顺序 - 假设您正在做跨平台的事情(或者使用音频样本格式作为另一个示例)重要的地方,有一些Core Foundation提供的功能,比如CFSwapInt32HostToBig()

    有关这些功能的更多信息,请查看Byte-Order Utilities Reference 页面,您可能会找到所需的内容。

    【讨论】:

    • 抛开其他问题不谈,OP 实际上需要获取一点字节序十六进制字符串表示的 int 值。
    【解决方案3】:

    回答:你不能。这个数字需要一个 128 位的整数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-24
      • 2021-01-29
      • 2012-06-26
      • 2018-04-21
      • 2020-09-10
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      相关资源
      最近更新 更多