我正在寻找代码来读取文本文件,该文本文件是在主机框架系统中创建的压缩十进制(Comp -3)数值,为8个字符,但是以压缩十进制格式保存了13位数字。
我遇到了以下代码
private Decimal Unpack(byte[] inp,int scale)
{
long lo = 0;
long mid = 0;
long hi = 0;
bool isnegative;
// this nybble stores only the sign,not a digit.
// "C" hex is positive,"D" hex is negative,and "F" hex is unsigned.
switch (nibble(inp,0))
{
case 0x0D:
isnegative = true;
break;
case 0x0F:
case 0x0C:
isnegative = false;
break;
default:
throw new Exception("Bad sign nibble");
}
long intermediate;
long carry;
long digit;
for (int j = inp.Length * 2 - 1; j > 0; j--)
{
// multiply by 10
intermediate = lo * 10;
lo = intermediate & 0xffffffff;
carry = intermediate >> 32;
intermediate = mid * 10 + carry;
mid = intermediate & 0xffffffff;
carry = intermediate >> 32;
intermediate = hi * 10 + carry;
hi = intermediate & 0xffffffff;
carry = intermediate >> 32;
// By limiting input length to 14,we ensure overflow will never occur
digit = nibble(inp,j);
if (digit > 9)
{
throw new Exception("Bad digit");
}
intermediate = lo + digit;
lo = intermediate & 0xffffffff;
carry = intermediate >> 32;
if (carry > 0)
{
intermediate = mid + carry;
mid = intermediate & 0xffffffff;
carry = intermediate >> 32;
if (carry > 0)
{
intermediate = hi + carry;
hi = intermediate & 0xffffffff;
carry = intermediate >> 32;
// carry should never be non-zero. Back up with validation
}
}
}
return new Decimal((int)lo,(int)mid,(int)hi,isnegative,(byte)scale);
}
private int nibble(byte[] inp,int nibbleNo)
{
int b = inp[inp.Length - 1 - nibbleNo / 2];
return (nibbleNo % 2 == 0) ? (b & 0x0000000F) : (b >> 4);
}
但是上面的代码无法说出错误的标志位。
谁能确认我的阅读是否正确
using (FileStream fs = new FileStream(pathSource,FileMode.Open))
{
using (StreamReader reader = new StreamReader(fs))
{
List<decimal> list = new List<decimal>();
while (!reader.EndOfStream)
{
byte[] b = ASCIIEncoding.ASCII.GetBytes(reader.ReadLine());
list.Add(Unpack(b,0));
}
reader.Close();
}
}
注意:它不是重复的,因为我正在寻找可以读取文件并将参数传递给Unpack方法的代码。
作为参考,我添加了文件内部数据的外观: