假设你有一个char数组,它包含8个字节。你如何将该char数组转换为整数?
我尝试使用sscanf -
int x;
sscanf(char_array, "%d", &x);
我正在读取二进制文件中的字节,将它们存储到char数组中,然后我尝试根据偏移值打印出一个int值。
答案 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。