2017-03-03 43 views
0

字符的位置,我正在尋找一種方式來ASCII文本轉換爲十六進制數據,我的意思是十六進制的方式,你可以得到製作獲取整理順序

MOVE X'nn' TO MYVAR. 

然後,我需要使用它像一個號碼(COMP-3我猜)。

,我打算給PIC(X)移動到PIC S9(2)V COMP-3,但我認爲不工作...

進一步解釋,因爲我的問題被標記爲不明確:

首先,對不起,我在深夜做了這個問題,現在又讀了,是的,目前還不清楚。

現在,真正的問題是,我想用一個char(假設「A」),因爲它是十六進制數字,表示將它作爲一個內部表中的索引。

例如,在C中,它可以很容易,使得:

int mynum; 
char mytext; 

mynum = atoi(mytext); 

然後使用mychar訪問陣列。所以,在COBOL我:

01 MY-TABLE. 
    05 MY-TABLE-ITEM PIC X OCCURS 1000. 

01 MY-TEXT PIC X 100. 
01 MY-TEXT-X PIC X OCCURS 100. 

然後,我要重複MY-TEXT-X並將其轉換成它的十六進制代碼,將其存儲到一個數字變量(PIC 9(n))的使用它來訪問MY-TABLE-ITEM,東西像:

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 100 
    PERFORM TRANSFORM-DATA 

    DISPLAY MY-TABLE-ITEM(MY-NUMBER) 
END-PERFORM 

正如我所說的,我以爲我可以移動PIC XPIC S9(2)V COMP-3所以數字變量可以得到價值,但它不工作如我所料...

編輯:

於是我就發現我的編譯器不支持的內在功能,這樣就不會幫我...

編輯 - 添加源代碼

所以,這裏是我使用的來源,也顯示來自編譯器和執行。

來源:

IDENTIFICATION DIVISION. 
    PROGRAM-ID. likeatoi. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 the-char       PIC X 
              VALUE "K". 
    01 the-result       PIC 999. 
    01 the-other-result    PACKED-DECIMAL PIC 9(8) 
              VALUE ZERO. 
    01 FILLER 
    REDEFINES the-other-result. 
     05 FILLER       PIC X. 
     05 char-to-convert     PIC X. 
    01 num pic 9(8). 
    PROCEDURE DIVISION. 
    MAINLINE. 
    * with instrinsic function 
    * MOVE FUNCTION ORD (the-char) 
    *        TO the-result. 
     DISPLAY 
      ">" 
      the-char 
      "<" 
      ">" 
      the-result 
      "<". 

    * Old School 
     MOVE the-char    TO char-to-convert. 
     DISPLAY 
      ">" 
      the-char 
      "<" 
      ">" 
      the-other-result 
      "<". 

     MOVE the-other-result  TO num. 
     DISPLAY num. 

     STOP RUN. 

現在,這裏所有的細節我想:

  1. 首先,嘗試編譯它機智固有功能ORD:

    ***** 1) 0384: E User-defined word expected instead of reserved word. (scan su

  2. 使用此編譯,運行程序(忽略錯誤):

COBOL procedure error 211 at line 17 in ./ESCRITORIO/HEX/LIKEATOI.COB (/home/dohitb/Escritorio/HEX/likeatoi.COB) compiled 17/03/05 20:37:29.

  • 註釋功能部分,然後再次編譯:
  • Errors: 0, Warnings: 1, Lines: 37 for program LIKEATOI.

    (警告用於顯示COMP變量,它的行)

    1. (與補償變量無 「數」,仍然)再次執行:

      >A<> <

      >A<>A<

    2. 添加 「NUM」 變量,改變字符爲 「K」,並改變COMP到PACKED- DECIMAL(在HEX:4B)

      >K<> <

      >K<>K<

      04900000

    所以,我告訴,無論是選擇正常工作。現在最精確的方法是使用PACKED-DECIMAL重新定義PIC 9,但HEX位置高於「A」時,它會給出「9」,所以它仍然無效。

    我認爲這可能是本地COLLATION的問題。

    最後編輯

    現在我所做的原始源代碼的變體:

    IDENTIFICATION DIVISION. 
        PROGRAM-ID. likeatoi. 
        DATA DIVISION. 
        WORKING-STORAGE SECTION. 
        01 the-char         PIC X 
                  VALUE "K". 
        01 the-result         PIC 999. 
        01 the-other-result    BINARY   PIC 9(4) 
                  VALUE ZERO. 
        01 FILLER-1 
        REDEFINES the-other-result. 
         05 FILLER       PIC X. 
         05 char-to-convert     PIC X. 
    
        01 the-comp-result    COMP   PIC 9(4) 
                  VALUE ZERO. 
        01 FILLER-2 
        REDEFINES the-comp-result. 
         05 FILLER       PIC X. 
         05 char-to-convert     PIC X. 
    
        01 the-packed-result   PACKED-DECIMAL PIC 9(4) 
                  VALUE ZERO. 
        01 FILLER-3 
        REDEFINES the-packed-result. 
         05 FILLER       PIC X. 
         05 char-to-convert     PIC X. 
    
        01 num         PIC 9(8). 
        01 alfa        PIC X(20) 
         VALUE 'ABCDEFGHIJabcdefghij'. 
        01 FILLER REDEFINES alfa. 
         05 char       PIC X OCCURS 20. 
        01 w-index        PIC 99 VALUE ZEROES. 
    
        PROCEDURE DIVISION. 
        MAINLINE. 
    
         PERFORM VARYING w-index FROM 1 BY 1 UNTIL w-index > 20 
          MOVE char(w-index)  TO the-char 
    
        *  Variations of "Old School" code 
          MOVE the-char   TO char-to-convert OF FILLER-1 
          MOVE the-char   TO char-to-convert OF FILLER-2 
          MOVE the-char   TO char-to-convert OF FILLER-3 
    
          DISPLAY 
          ">" 
          the-char 
          "<" 
          " with BINARY >" 
          the-other-result 
          "<" 
    
          MOVE the-other-result  TO num 
          DISPLAY "Numeric value: " num 
    
          DISPLAY 
          ">" 
          the-char 
          "<" 
          " with COMP >" 
          the-comp-result 
          "<" 
    
          MOVE the-comp-result  TO num 
          DISPLAY "Numeric value: " num 
    
          DISPLAY 
          ">" 
          the-char 
          "<" 
          " with PACKED >" 
          the-packed-result 
          "<" 
    
          MOVE the-packed-result  TO num 
          DISPLAY "Numeric value: " num 
         END-PERFORM. 
    
         STOP RUN. 
    

    而且,對於我吃驚的是,它給我這個輸出

    >A< with BINARY >A< 
    
    Numeric value: 00000065 
    
    >A< with COMP >A< 
    
    Numeric value: 00000100 
    

    (等...)所以現在看起來像是在工作......可能是因爲我第一次嘗試使用05-LEVEL變量?

    看起來像現在完成了!

    感謝所有,比爾,你的身影在我的項目:)

    的問候段最後一個細節。

    如果我做一個「MOVE」

    MOVE 'A'  TO CHAR 
    

    然後做所有二進制的東西,結果是不同的......這裏的例子。

    VALUE,對於「d」我得到的68,但MOVE我得到60 ...

    +0

    你將需要更清楚。 HEX只是一個符號,通常用於描述ASCII字符的位模式。所以......你能提供一些你想要的東西的例子嗎? –

    +0

    你添加到你的問題的標籤應該是相關的。每個標籤都有一個描述。如果描述不符合將搜索引擎提供給您的問題的某些有用內容,則只會讓人們抱怨使用該標籤。他們不是「主題標籤」。 –

    +0

    查看COBOL的文檔。在內在函數中,你可能會發現你需要的東西。但這是一個猜測。 –

    回答

    1

    你一直在使用舊的編譯器的痛苦。它符合COBOL 85標準,但沒有1989年標準擴展的內在功能。另外,它有一個非標準的行爲,我以前沒有遇到過,這很難完全解釋(不能訪問該編譯器)。

    在DISPLAY中使用>和<的要點是,您始終可以確切知道每個輸出字段的長度。您知道是否有空白或某些不可打印的字符。定義爲COMP和BINARY的字段的DISPLAY只顯示一個字符,而不是四個數字,通常會保存在兩個字節的存儲區中(如INT,但限制爲9999)。

    因此,我提出了MOVE,在那裏你定義爲BINARY時得到預期的結果,當定義爲COMP時定義爲...不明原因的結果。

    COMP結果的一種解釋可能是COMPUTATIONAL字段完全由編譯器實現者定義。因此,在一個系統上的COMP與另一個系統上的COMP的類型可能不同(與COMP-1,COMP-2,COMP-3 etC相同)。這就是爲什麼1985標準引入了新名稱(例如BINARY和PACKED-DECIMAL),以便它們可以跨COBOL編譯器移植。

    如果你堅持使用該編譯器,那麼你是不幸的。如果您有可能使用其他編譯器,除了其他選擇外,您還可以找到開源的GnuCOBOL(我是SourceForge.Net上GnuCOBOL項目討論區的主持人)。如果可以,請使用其他編譯器。

    下面是一個示例程序,該程序將使用內部函數ORD和過去完成的方式(可能仍然完成)來處理現代COBOL編譯器。請注意,如果您的COMP字段是「little endian」,請將REDFINES下的FILLER和字段的順序交換。

    IDENTIFICATION DIVISION. 
        PROGRAM-ID. likeatoi. 
        DATA DIVISION. 
        WORKING-STORAGE SECTION. 
        01 the-char       PIC X 
                   VALUE "A". 
        01 the-result       PIC 999. 
        01 the-other-result    BINARY PIC 9(4) 
                   VALUE ZERO. 
        01 FILLER 
         REDEFINES the-other-result. 
         05 FILLER       PIC X. 
         05 char-to-convert     PIC X. 
        PROCEDURE DIVISION. 
        * with instrinsic function 
         MOVE FUNCTION ORD (the-char) 
                TO the-result 
         DISPLAY 
           ">" 
           the-char 
           "<" 
           ">" 
           the-result 
           "<" 
    
        * Old School 
         MOVE the-char    TO char-to-convert 
         DISPLAY 
           ">" 
           the-char 
           "<" 
           ">" 
           the-other-result 
           "<" 
    
         STOP RUN 
         . 
    

    的ORD是容易的,它實際上等同於C(假設,讓你在整理sequenece的位置),您的atoi。

    第二,由於COBOL傳統上不能有一個字節的二進制,因此使用REDEFINES可以在兩個字節的二進制的低位部分獲得一個字符,這樣整個二進制字段表示該字符表示的「數字值」。

    從上述的輸出是:

    >A<>066< 
    >A<>0065< 
    

    注意ORD給出位置在整理序列(二進制零與ORD將返回一個),第二個是隻給直接表示(二進制零會給零)。

    要使用其中任何一個值,如果您只對可打印字符感興趣,則可能希望在之後「重新使用」這些值。

    請注意,我很困惑,你有一個支持內聯PERFORM但不是內部函數的編譯器。如果BINARY的使用被拒絕,請使用COMP代替。

    +0

    試過了,但是,正如我告訴過你的,它失敗了。嘗試過的組合... COMP,COMP-3,BINARY ...最準確的是PACKED-DECIMAL,使用PIC 9(2)PACKED-DECIMAL,然後使用REDEFINES PIC S9(3)。有了這個配置,對於「A」它給了我「412」,因爲「B」給了我「422」等等。我看到兩個第一個數字是正確的十六進制值,所以對我來說沒問題,但是當我等待一種「4A」時,我得到了「49」(即,對於所有數字gretaer或等於「A」,它看起來是一個「9」... –

    +0

    你可以添加你使用的代碼到你的問題嗎? –

    +0

    done。我基本上使用你的源碼... –