首页
论坛
专栏
课程

[已解决] [求助]关于C#读取文件的一个问题 58.00元

zxhy 2018-12-4 14:44 233

以上这段代码是反编译得到的是读入下面的一个文件
其中 Signature 是取读取的 20 字节的前 5 个字节
version 是取第 5 个字节的 ASCII 数值
但是 ResourcesCount 这个我一直没弄懂是怎么回事
麻烦大佬能解释一下这句的意思么
已知ResourcesCount是一个大于500小于600的一个十进制数字

附读入的文件


原帖在这里 我需要使用python重写这个方法 但是一直不理解ResourcesCount的意思 

https://bbs.pediy.com/thread-248121.htm

[推荐]十年磨一剑!《加密与解密(第4版)》上市发行

最新回复 (7)
DickBoomSky 2018-12-5 10:48
2

0

首先这个方法的原型是public static uint ToUInt32 (byte[] value, int startIndex);,他的功能是返回由字节数组中指定位置的四个字节转换来的 32 位无符号整数
C#。

 

第一个参数是字节数组.

 

第二个参数是value内的起始位置。

 

所以ResourcesCount的值就是之前读取到的20个字节长度的数据的第16个字节开始向后读取四个字节,然后转化为32位的无符号整形。

 

用python代码来表示的话就是这样的,你的这个文件中的数据是大端的还是小段的我就不知道了,如果是大端的话那就把little换成big就可以了

ResourcesCount = int.from_bytes(s1, byteorder='little', signed=False)
yegu 2018-12-6 08:41
3

0

lz把读取的文件上传一下,我帮你用python或C++或C#完整写出来
最后于 2018-12-6 08:42 被yegu编辑 ,原因:
zxhy 2018-12-6 22:44
4

0

这个是样本
上传的附件:
zxhy 2018-12-6 22:45
5

0

DickBoomSky 首先这个方法的原型是`public static uint ToUInt32 (byte[] value, int startIndex);`,他的功能是`返回由字节数组中指定位置的四个字节转换来的 ...
首先感谢你的回复 不过我在使用这个方法的时候 发现取到的是一个特别大的数字  请问是数据转换的问题嘛 
zxhy 2018-12-6 22:46
6

0

感谢
样本已经上传在上面 
DickBoomSky 2018-12-7 11:39
(+¥58.00) 7

0

VC版本:
// fffparser.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>
#define SIMPLEFILE "simple.ffff"

struct header
{
	char Signature[5];
	char version;
	char useless[10];
	DWORD ResourcesCount;
};

int main()
{
	HANDLE hFile = CreateFile(SIMPLEFILE, GENERIC_READ, NULL, NULL, OPEN_EXISTING, NULL, NULL);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		printf("Cannot open file!\n");
		return 0;
	}



	header * data = (header *)malloc(sizeof(header));
	ZeroMemory(data, 20);

	ReadFile(hFile, data, 20, NULL, NULL);

	unsigned int ResourcesCount = data->ResourcesCount;

	printf("Signature: %c%c%c%c%c\n", data->Signature[0], data->Signature[1], data->Signature[2], data->Signature[3], data->Signature[4]);
	printf("Version: %d\n", data->version);
	printf("ResourcesCount: %d\n", ResourcesCount);  // 我得到的结果是695,和你说的500-600有点不太一样。

	CloseHandle(hFile);

    return 0;
}


python版本:
f = open('simple.ffff', 'rb')
data = f.read(20)
f.close()

Signature = data[:5]
Version = data[5]
useless = data[6:-4]
ResourcesCount = bytes(data[16:])


print(Signature)
print(Version)
print(int.from_bytes(ResourcesCount, "little", signed=False))

我得到的结果都是695,提取到的数据是0xB7020000。怎么转换都是695。
zxhy 2018-12-7 12:37
8

0

感谢
返回