[英]How can I replicate Perl's unpack functionality in C#?
我试图在C#中重新创建一个Perl脚本,但是在创建目标系统所需的校验和值时遇到问题。
在Perl中,使用unpack
函数计算此校验和:
while (<PACKAGE>) {
$checksum += unpack("%32C*", $_);
}
$checksum %= 32767;
close(PACKAGE);
其中PACKAGE
是.tar文件输入流
我需要在C#中复制它,但无法找到复制该unpack
函数的方法。
所有帮助赞赏!
(我知道有更好的校验和计算可用但不能改变目标系统因此无法改变计算)
Mono中似乎有一个名为DataConvert的库,它是为了提供类似于Perl的打包/解包而设置的。 这样做你需要的吗?
为了补充Mitch Wheat的评论,这里是一个Java实现(仅执行一个块)。 我相信你会找到一种方法将它转换为C#,并做多个块。
int sum = 0;
for (byte b : buffer) {
sum += (int) b & 255;
}
return sum % 32767;
希望这可以帮助!
在我的测试中,使用%32C解压缩似乎是字节的附加和,限制为32位。
print unpack("%32C*", 'A');
65
print unpack("%32C*", 'AA');
130
重现这一点应该不难。
根据Chris Jester-Young和piCookie的评论,我开发了以下功能。 希望对你有帮助。
int fileCheckSum(const char *fileName)
{
FILE *fp;
long fileSize;
char *fileBuffer;
size_t result;
int sum = 0;
long index;
fp = fopen(fileName, "rb");
if (fp == NULL)
{
fputs ("File error",stderr);
exit (1);
}
fseek(fp, 0L, SEEK_END);
fileSize = ftell(fp);
fseek(fp, 0L, SEEK_SET);
fileBuffer = (char*) malloc (sizeof(char) * fileSize);
if (fileBuffer == NULL)
{
fputs ("Memory error",stderr);
exit (2);
}
result = fread(fileBuffer, 1, fileSize, fp);
if (result != fileSize)
{
fputs ("Reading error", stderr);
if (fileBuffer != NULL)
free(fileBuffer);
exit (3);
}
for (index = 0; index < fileSize; index++)
{
sum += fileBuffer[index] & 255;
}
fclose(fp);
if (fileBuffer != NULL)
free(fileBuffer);
return sum % 32767;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.