在C程序中将压缩十进制的字符数组转换为整数

时间:2014-04-10 16:38:03

标签: character decimal buffer type-conversion packed-decimal

我需要编写一个C程序来将缓冲区中的压缩十进制字段转换为整数值。压缩十进制的精度为9,Scale为0.在IBM大型机C程序中转换它的最佳方法是什么?在Cobol中,使用Packed Decimal的格式是Comp-3 任何帮助都是值得赞赏的。

2 个答案:

答案 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;
}