我需要编写一个C程序来将缓冲区中的压缩十进制字段转换为整数值。压缩十进制的精度为9,Scale为0.在IBM大型机C程序中转换它的最佳方法是什么?在Cobol中,使用Packed Decimal的格式是Comp-3 任何帮助都是值得赞赏的。
答案 0 :(得分:1)
如果您在Zos主机上运行该程序,则C编译器本身支持压缩十进制。
Google for" Zos C定点十进制类型"应该为您提供正确的手册页 它简单如下:
#include <decimal.h>
decimal(9,0) mynum;
答案 1 :(得分:1)
The one way I think it can be done, is
long long MyGetPackedDecimalValue(char* pdIn, int length)
{
// Convert packed decimal to long
const int PlusSign = 0x0C; // Plus sign
const int MinusSign = 0x0D; // Minus `enter code here`
const int NoSign = 0x0F; // Unsigned
const int DropHO = 0xFF; // AND mask to drop HO sign bits
const int GetLO = 0x0F; // Get only LO digit
long long val = 0; // Value to return
printf ("in side ****GetPDVal \n ");
for(int i=0; i < length; i++)
{
int aByte = pdIn[i] & DropHO; // Get next 2 digits & drop sign bits
if(i == length - 1)
{ // last digit?
int digit = aByte >> 4; // First get digit
val = val*10 + digit;
printf("digit= %d, val= %lld \n",
digit,
val);
int sign = aByte & GetLO; // now get sign
if (sign == MinusSign)
{
val = -val;
}
else
{
// Do we care if there is an invalid sign?
if(sign != PlusSign && sign != NoSign)
perror("SSN:Invalid Sign nibble in Packed Decimal\n");
}
}
else
{
int digit = aByte >> 4; // HO first
val = val*10 + digit;
printf("digit= %d, val= %lld \n",
digit,
val);
digit = aByte & GetLO; // now LO
val = val*10 + digit;
printf("digit= %d, val= %lld \n",
digit,
val);
}
}`enter code here`
printf ("**** coming out GetPDVal \n ");
return val;
}