二进制文件读取,将2个字节转换为一个unsigned short C
Binary file reading, convert 2 bytes to an unsigned short C
我在一次读取 2 个字节并将其转换为无符号短大端字节序时遇到问题。
这是我现在的代码,我也想打印unsigned short big endian,应该是数字25。
所以这段代码是读取一个二进制文件,我把所有的文件都保存到一个buffer中,我需要buffer[5]和buffer[6]到unsigned short, big endian
void read_binair(const char* filename)
{
FILE *file;
char *buffer;
unsigned long fileLen;
int i;
char character;
Level* level = level_alloc_empty();
file = fopen(filename, "rb");
if (!file)
{
fprintf(stderr, "Unable to open file %s", filename);
return;
}
fseek(file, 0, SEEK_END);
fileLen = ftell(file);
fseek(file, 0, SEEK_SET);
buffer = (char *)malloc(fileLen + 1);
if (!buffer)
{
fprintf(stderr, "Memory error!");
fclose(file);
return;
}
fread(buffer, fileLen, 1, file);
for (i = 0; i < 4; i++)
{
printf("%c", (char) buffer[i]);
}
i = buffer[4];
printf("%d", i);
//read buffer[5] and buffer[6] together as a unsigned short, big endian
fclose(file);
}
以下代码将从 buffer
中的大端创建一个 unsigned short
:
unsigned short us = (buffer[5] << 8) | buffer[6];
假设 -
- 您正在使用支持 C99 的编译器,并且
- 文件中的数据是网络字节序
你需要-
uint16_t half_word = ((uint8_t)buffer[5] << 8) | ((uint8_t)buffer[6])
P.S。 -
- 使用
uint8_t *buffer
而不是 char *buffer
来避免对缓冲区八位字节进行类型转换的需要。
- 如果您正在使用 C89/90 -
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
我在一次读取 2 个字节并将其转换为无符号短大端字节序时遇到问题。
这是我现在的代码,我也想打印unsigned short big endian,应该是数字25。
所以这段代码是读取一个二进制文件,我把所有的文件都保存到一个buffer中,我需要buffer[5]和buffer[6]到unsigned short, big endian
void read_binair(const char* filename)
{
FILE *file;
char *buffer;
unsigned long fileLen;
int i;
char character;
Level* level = level_alloc_empty();
file = fopen(filename, "rb");
if (!file)
{
fprintf(stderr, "Unable to open file %s", filename);
return;
}
fseek(file, 0, SEEK_END);
fileLen = ftell(file);
fseek(file, 0, SEEK_SET);
buffer = (char *)malloc(fileLen + 1);
if (!buffer)
{
fprintf(stderr, "Memory error!");
fclose(file);
return;
}
fread(buffer, fileLen, 1, file);
for (i = 0; i < 4; i++)
{
printf("%c", (char) buffer[i]);
}
i = buffer[4];
printf("%d", i);
//read buffer[5] and buffer[6] together as a unsigned short, big endian
fclose(file);
}
以下代码将从 buffer
中的大端创建一个 unsigned short
:
unsigned short us = (buffer[5] << 8) | buffer[6];
假设 -
- 您正在使用支持 C99 的编译器,并且
- 文件中的数据是网络字节序
你需要-
uint16_t half_word = ((uint8_t)buffer[5] << 8) | ((uint8_t)buffer[6])
P.S。 -
- 使用
uint8_t *buffer
而不是char *buffer
来避免对缓冲区八位字节进行类型转换的需要。 - 如果您正在使用 C89/90 -
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;