按照4位大小端(即32位整数)进行转换
为了确保数据按照4位大小端(即32位整数)进行转换,我们需要在将数据写入文件之前,对每个32位整数进行大小端转换。具体来说,如果原始数据是以大端序(Big Endian)存储的,而目标系统是小端序(Little Endian),或者反之,则需要进行大小端转换。
以下是一个示例代码,展示了如何在将数据写入文件之前进行32位大小端转换:
- 文件打开:使用
"wb"
模式打开文件img.bin
。 - 内存分配:使用
malloc
分配缓冲区,并检查是否分配成功。 - 数据获取:调用
get_data_from_fpga_ddr
函数从 FPGA DDR 获取数据。 - 大小端转换:对每个32位整数进行大小端转换。
- 数据写入:使用
fwrite
函数将转换后的数据写入文件。 - 错误处理:在每个关键步骤后检查是否成功,并在失败时释放资源并返回错误码。
- 资源释放:在完成文件操作后关闭文件并释放分配的内存。
以下是修正后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
// 假设这是从 FPGA DDR 获取数据的函数声明
void get_data_from_fpga_ddr(void* ddr_addr, void* buffer, size_t size, void* xdma);
// 大小端转换函数
uint32_t swap_endian(uint32_t value) {
return ((value & 0xFF000000) >> 24) |
((value & 0x00FF0000) >> 8) |
((value & 0x0000FF00) << 8) |
((value & 0x000000FF) << 24);
}
int main() {
FILE *file = fopen("/home/NpuFtCoreAPP/img.bin", "wb"); // 使用小写的 "w" 并保存为 img.bin
if (file == NULL) {
printf("open file fail!\\n");
return -1; // 返回一个错误码
}
long BUFFER_SIZE = 55000000; // 缓冲区大小
char* buffer = (char*)malloc(BUFFER_SIZE);
if (buffer == NULL) {
printf("memory allocation failed!\\n");
fclose(file);
return -1; // 返回一个错误码
}
memset(buffer, 0, BUFFER_SIZE);
// 假设 ddr_addr_W0 和 xdma_dma0 已经定义
void* ddr_addr_W0 = NULL; // 替换为实际的地址
void* xdma_dma0 = NULL; // 替换为实际的 XDMA 句柄
get_data_from_fpga_ddr(ddr_addr_W0, buffer, 48 * 1024 * 1024, xdma_dma0);
// 打印前16个字节的数据进行调试
printf("First 16 bytes of buffer before conversion: ");
for (int i = 0; i < 16; i++) {
printf("%02x ", buffer[i]);
}
printf("\\n");
// 进行大小端转换
uint32_t* int_buffer = (uint32_t*)buffer;
size_t num_ints = 48 * 1024 * 1024 / sizeof(uint32_t);
for (size_t i = 0; i < num_ints; i++) {
int_buffer[i] = swap_endian(int_buffer[i]);
}
// 打印前16个字节的数据进行调试
printf("First 16 bytes of buffer after conversion: ");
for (int i = 0; i < 16; i++) {
printf("%02x ", buffer[i]);
}
printf("\\n");
// 直接将 buffer 中的数据写入文件
size_t bytes_written = fwrite(buffer, 1, 48 * 1024 * 1024, file);
if (bytes_written != 48 * 1024 * 1024) {
printf("write to file failed!\\n");
free(buffer);
fclose(file);
return -1; // 返回一个错误码
}
free(buffer);
fclose(file);
return 0;
}
关键点:
- 大小端转换函数:
swap_endian
函数用于将32位整数从大端序转换为小端序,或者反之。 - 数据转换:在将数据写入文件之前,对每个32位整数进行大小端转换。
- 调试信息:在转换前后打印前16个字节的数据,以便验证转换是否正确。
调试建议:
- 检查数据源:确保
get_data_from_fpga_ddr
函数正确地从 FPGA DDR 获取数据,并且数据是正确的。 - 打印数据:在
get_data_from_fpga_ddr
调用之后,打印部分数据以验证数据是否正确。 - 文件路径:确保文件路径
/home/NpuFtCoreAPP/img.bin
是正确的,并且程序有权限写入该路径。
通过这种方式,你可以确保数据在写入文件之前已经正确地进行了大小端转换。如果数据仍然不一致,问题可能出在 get_data_from_fpga_ddr
函数中,需要进一步检查该函数的实现。
本文来自博客园,作者:Ryan,转载请注明原文链接:https://www.cnblogs.com/Ryan9399/p/18776336