如何在char数组中将base10十进制(大端)转换为二进制(小端的十六进制)

时间:2013-03-21 19:40:39

标签: c hex decimal endianness

我在iOS上遇到了一些麻烦。 我一直在尝试将base10十进制值转换为 little endian 十六进制字符串。

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

例如,我想在 little endian hexadecinmal中转换以下整数:

  

int val = 11234567890123456789112345678911;

3 个答案:

答案 0 :(得分: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

将结果字节转换为十六进制字符串(如果这是你想要的)应该是微不足道的。

答案 1 :(得分:0)

答案:你不能。这个数字需要128位整数。

答案 2 :(得分:0)

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

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