2017-07-13 14 views
-2

以下は、私がSASに変換する必要があるmatlabの機能です。 'value'の1行目は 'SUBID_IN_HEX'として以下に示されています。SAS 16進デコーダ

DATA WORK.QUERY_FOR_GETS_DW_EOA_FAULTS; 
    SET WORK.QUERY_FOR_GETS_DW_EOA_FAULTS; 
    SUBID_IN_HEX = SUBID ; 
    FORMAT SUBID_IN_HEX $hex.; 

RUN; 

'mask'と 'start_bit_pos'は、9つの要素で構成される配列です。私はsasには新しいので、進める方法については良いアドバイスをいただければ幸いです。

敬具、 スティーブ

function decode = get_TABS_bitpack_decoded(hex) 

value = hex2dec(hex); 
mask = [1 2 4 8 16 hex2dec('1fe0') hex2dec('fe000') hex2dec('3f00000') ... 
    hex2dec('fc000000')]; 
start_bit_pos = [0:5 13 20 26]; 
for i = 1:length(mask) 
    temp(i) = bitand(mask(i),value); 
    decode(i) = bitshift(temp(i),-start_bit_pos(i)); 
end 
decode = decode(:); 

私は、以下の更新されたコードのバージョンを持っています。配列のデコード{9}に続いてエラー124が発生します。コメント部分には、その概念を示すブルートフォース方式が示されています。ドループは究極の目標です。

もう一度、有益なコメントをいただきありがとうございます。

%macro decoderloop(SUBID_IN_HEX); 
    call missing(decod); 
    array mask{9} (1 2 4 8 16 8160 1040384 66060288 4227858432); 
    array start_bit_pos{9} (0:5 13 20 26); 
    array decod{9} (0 0 0 0 0 0 0 0 0); 

    /* 

    temp = band(mask[1],SUBID_IN_HEX); 
    decod[1] = BRSHIFT(temp,start_bit_pos[1]); 
    temp = band(mask[2],SUBID_IN_HEX); 
    decod[2] = BRSHIFT(temp,start_bit_pos[2]); 
    temp = band(mask[3],SUBID_IN_HEX); 
    decod[3] = BRSHIFT(temp,start_bit_pos[3]); 
    temp = band(mask[4],SUBID_IN_HEX); 
    decod[4] = BRSHIFT(temp,start_bit_pos[4]); 
    temp = band(mask[5],SUBID_IN_HEX); 
    decod[5] = BRSHIFT(temp,start_bit_pos[5]); 
    temp = band(mask[6],SUBID_IN_HEX); 
    decod[6] = BRSHIFT(temp,start_bit_pos[6]); 
    temp = band(mask[7],SUBID_IN_HEX); 
    decod[7] = BRSHIFT(temp,start_bit_pos[7]); 
    temp = band(mask[8],SUBID_IN_HEX); 
    decod[8] = BRSHIFT(temp,start_bit_pos[8]); 
    temp = band(mask[9],SUBID_IN_HEX); 
    decod[9] = BRSHIFT(temp,start_bit_pos[9]);*/ 
    %do i = 1 %to 9; 
     temp = band(mask[&i],SUBID_IN_HEX); 
     decod[&i] = BRSHIFT(temp,start_bit_pos[&i]); 
    %end; 
%mend decoderloop; 
+0

あなたの機能のためのいくつかのサンプル入力と期待される出力を投稿することができますか? – user667489

+1

こんにちは、StackOverflowへようこそ。私たちはコード作成サービスではありません。あなたが必要とするものなら、コンサルタントを雇うことを歓迎します。ここで助けが必要な場合は、これを自分で解決し、具体的な質問をする必要があります。特に、これが何をしているのかを考え、SAS技術を使ってSASで試してみる必要があります。 bitパッキングは典型的なSASテクニックではありませんので、これについてはもっと良い方法があります。 – Joe

答えて

0

私のMatlabのはかなり錆びですが、私は次のように使用すると、データ受信ステップで置き換えることができ、水平配列を返しますget_TABS_bitpack_decodedサブルーチンコールを作成することにより、探しているものを行いますと信じています。

proc fcmp outlib=work.func.conv; 
    function hex2dec(hex $); 
     return (inputn(hex,cats('hex',lengthn(hex),'.'))); 
    endsub; 

    subroutine get_TABS_bitpack_decoded(hex $, out[9]); 
     outargs out; 
     value = hex2dec(hex); 
     array mask[9] /nosymbols (1 2 4 8 16 1fe0x 0fe000x 3f00000x /*...*/ 0fc000000x); 
     array start_bit_pos[9] /nosymbols (0 1 2 3 4 5 13 20 26); 
     file log; 
     do i=1 to dim(mask); 
      temp=band(mask[i],value); 
      out[i]=brshift(temp,start_bit_pos[i]); 
     end; 
    endsub; 
quit; 

options cmplib=work.func; 

data work.query_for_gets_dw_eoa_faults; 
    input subid @@; 
    SUBID_IN_HEX = put(subid,hex16.); 
    array _decode[9] _temporary_; 
    call get_TABS_bitpack_decoded(SUBID_IN_HEX,_decode); 
    do i=1 to dim(_decode); 
     decode=_decode[i]; 
     output; 
    end; 
datalines; 
8160 
; 
run; 

proc print data=work.query_for_gets_dw_eoa_faults; 
    id SUBID; 
    var i decode; 
run; 
 
subid | i | decode 
----- | - | ------ 
8160 | 1 |  0 
8160 | 2 |  0 
8160 | 3 |  0 
8160 | 4 |  0 
8160 | 5 |  0 
8160 | 6 | 255 
8160 | 7 |  0 
8160 | 8 |  0 
8160 | 9 |  0 
%macro decoderloop(var); 
    *call missing(decod);*this here causes intantiation or decod as scalar not array; 
    array mask[9]   _temporary_ (1 2 4 8 16 8160 1040384 66060288 4227858432); 
    array start_bit_pos[9] _temporary_ (0:5 13 20 26); 
    array decod[9]; 
    call pokelong(repeat(put(0,rb8.),8),addrlong(decod[1]),72);*initialize values of decod to all 0, replaces bad call missing and array defaults which do not reinitialize upon data step iteration; 
    do _n_=1 to 9;*no macro loop, loop in data step instead of generating repeated code; 
     decod[_n_]=brshift(band(mask[_n_],&var),start_bit_pos[_n_]); 
    end; 
%mend; 
data foo; 
    SUBID_IN_HEX=8160; 
    %decoderloop(SUBID_IN_HEX) 
run; 
+0

ご意見ありがとうございます。私は以下のアップデートコードを持っています。コメントアウトは、その概念を示すブルートフォース方式です。 doループは私が手に入れたいものです。しかし、array decod {9}行に続いてエラー124が発生します。 – steve

+0

こんにちは、私は、マクロdecoderloopをテストし、それは正常に働いた。助けてくれてありがとう。 - スティーブ – steve