[英]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.