将char数组转换为C中的int

时间:2015-04-29 02:18:11

标签: c char byte 32-bit

假设你有一个char数组,它包含8个字节。你如何将该char数组转换为整数?

我尝试使用sscanf -

int x;
sscanf(char_array, "%d", &x);

我正在读取二进制文件中的字节,将它们存储到char数组中,然后我尝试根据偏移值打印出一个int值。

5 个答案:

答案 0 :(得分:1)

以下将4字节数组(4个字符)转换为32位无符号整数。 您应该能够轻松地将其扩展为8个字符(即64位无符号整数)。

向后迭代数组(也可以向前移动)并相应地移动相应字符的int表示,并将其拟合到结果值中。

#include <iostream>
#include <cstdint>

using namespace std;

int main() {
    char arr[] = {0x00, 0x00, 0x1B, 0x1B}; // just for my testing convenience
    uint32_t val = 0;
    for (int i = 3; i >= 0; i--) {
        uint32_t tmp = arr[i];
        int j = 4 - i;
        while (--j) {
            tmp <<= 8;
        }
        val |= tmp;
    }

    cout << val << endl;
}

答案 1 :(得分:1)

将8个字符串组合成一个整数将产生一个64位整数,因此您可能需要将其声明为data['checkBox[]'] = $('input[name="checkBox[]"]:checked').map(function() { return $(this).val(); }); ...

unsigned long long int

PS。从文件中读取字节时,可能需要注意big-endian或little-endian表示。

答案 2 :(得分:1)

我想你只想读取十六进制数字,这些数字通常是文本形式的8个字节。你可以用这个:

sscanf(char_array, "%x", &x);

如果它真的是二进制的,那么它每个将是4个字节,它取决于机器是小端还是大端。大多数计算机都是小端的。要制作便携版本,您可以使用以下功能:

#ifdef BIG_ENDIAN
#define memcpy_set(buf,v) memcpy(buf, &v, 4)
#else
#define memcpy_set(buf,v) { for (int i = 0; i < 4; i++) buf[i] = v >> (24 - 8 * i); }
#endif
#define memcpy_get(buf) (buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3])

int main()
{
    if (sizeof(int) != 4)
        return 0;

    char buf[5];
    memset(buf, 0, 5);

    memcpy_set(buf, 0x41424344);
    printf("%s\n", buf);// buf = "ABCD"
    printf("%x\n", memcpy_get(buf)); //0x41424344

    return 0;
}

答案 3 :(得分:0)

如果从二进制文件中读取字节,我建议直接从文件中读取整数变量。如下:

#include        <stdio.h>

int             main() {
  FILE          *file = fopen("myFile", "r");
  int           i;

  if (file) {
    fread(&i, sizeof(i), 1, file);
    printf("%d\n", i);
    fclose(file);
  }
  return (0);
}

但是如果你无法摆脱你的char数组作为转换的来源,你可以使用联合来轻松地执行转换:

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

typedef union           u_bytes_to_int_type
{
  int                   value;
  char                  bytes[sizeof(int)];
}                       u_bytes_to_int_type;

void                    reverseArray(char *array, unsigned int const size) {
  char                  tmp;
  unsigned int          reverseIdx;

  for (unsigned int i = 0; i < size / 2; ++i) {
    reverseIdx = size - 1 - i;

    tmp = array[i];
    array[i] = array[reverseIdx];
    array[reverseIdx] = tmp;
  }
}

int                     main() {
  char                  endiannessIsDifferent = 0; // It's up to you how you determine the value of this variable.
  char                  array[sizeof(int)] = {0x2a, 0, 0, 0};
  u_bytes_to_int_type   v;

  memcpy(v.bytes, array, sizeof(array));
  /*
  ** Will reverse the order of the bytes in case the endianness of
  ** the source array is different from the one you need.
  */
  if (endiannessIsDifferent) {
    reverseArray(v.bytes, sizeof(v.bytes));
  }

  printf("%i\n", v.value);
  return (0);
}

答案 4 :(得分:-1)

我一般认为你必须首先存储为char,然后在println()期间转换为int。