bash 将二进制转换为十进制_Bash脚本 - 读取二进制文件
发布日期:2021-06-24 11:48:53 浏览次数:2 分类:技术文章

本文共 2550 字,大约阅读时间需要 8 分钟。

如果这不是你的硬核,我建议编译以下C语言程序:

#include

#include

typedef union {

char array[sizeof(int32_t)];

int32_t val;

} int32_u;

typedef union {

char array[sizeof(uint32_t)];

uint32_t val;

} uint32_u;

typedef union {

char array[sizeof(uint64_t)];

uint64_t val;

} uint64_u;

typedef union {

char array[sizeof(int64_t)];

int64_t val;

} int64_u;

int swap(char* mem, int size) {

if (size & 1 != 0)

return -1;

int i;

for (i = 0; i < size / 2; i++) {

char tmp = mem[i];

mem[i] = mem[size - i - 1];

mem[size - i - 1] = tmp;

}

return 0;

}

int sys_big_endian() {

int x = 1;

return !(*(char*)&x);

}

int main(int argc, char** argv) {

char* file_name = NULL;

int offset = 0;

char* type = "int32";

int big_endian = 0;

int i;

for(i = 1; i < argc; i++) {

if(!strncmp("-o", argv[i], 2)) {

++i;

sscanf(argv[i], "%d", &offset);

} else if(!strncmp("-t", argv[i], 2)) {

++i;

type = argv[i];

} else if(!strncmp("-e", argv[i], 2)) {

++i;

big_endian = !strncmp("big", argv[i], 3);

} else {

file_name = argv[i];

break;

}

}

if (i < argc - 1) {

fprintf(stderr, "Ignoring extra arguments: ");

++i;

for (; i < argc; i++) {

fprintf(stderr, "%s ", argv[i]);

}

fprintf(stderr, "n");

}

if (file_name == NULL) {

fprintf(stderr, "Syntax: readint [-o offset] [-t type] [-e endian] n"

"Where:n"

" type 'uint32', 'uint64', 'int32' (default), 'int64'.n"

" endian 'big' or 'little' (default).n"

" offset offset in a file from where the read will happen, default is 0.n"

);

return -1;

}

FILE* fp = fopen(file_name, "rb");

if (fp == NULL) {

fprintf(stderr, "Could not open the file: %sn", file_name);

return -1;

}

fseek(fp, offset, SEEK_SET);

if (!strncmp("uint32", type, 6)) {

uint32_u u;

fread(u.array, sizeof(u.array), 1, fp);

if (big_endian ^ sys_big_endian())

swap(u.array, sizeof(u.array));

printf("%un", u.val);

} else if (!strncmp("int32", type, 5)) {

int32_u u;

fread(u.array, sizeof(u.array), 1, fp);

if (big_endian ^ sys_big_endian())

swap(u.array, sizeof(u.array));

printf("%dn", u.val);

} else if (!strncmp("uint64", type, 6)) {

uint64_u u;

fread(u.array, sizeof(u.array), 1, fp);

if (big_endian ^ sys_big_endian())

swap(u.array, sizeof(u.array));

printf("%"PRIu64"n", u.val);

} else if (!strncmp("int64", type, 5)) {

int64_u u;

fread(u.array, sizeof(u.array), 1, fp);

if (big_endian ^ sys_big_endian())

swap(u.array, sizeof(u.array));

printf("%"PRId64"n", u.val);

} else {

printf("Unknown type: %sn", type);

}

fclose(fp);

return 0;

}

然后这样做:

gcc -o readint readint.c

sudo mv readint /usr/local/bin

现在,您有一个名为'readint'的便捷工具,其语法如下:

readint [-o offset] [-t int32|uint32|int64|uint64 ] [-e little|big ]

转载地址:https://blog.csdn.net/weixin_32573931/article/details/114487609 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java一箭穿心的代码_Java打印一箭穿心
下一篇:autocad2014 连接mysql_auto mysql

发表评论

最新留言

不错!
[***.144.177.141]2024年04月22日 08时22分48秒