matlab中的函数返回向量

function returning vector in matlab

我在 MatLab 中有一个函数 returning 一个向量,问题是函数应该 return 一个无符号整数值,我调试了我的代码,我意识到变量 [=当我执行 bitandbitxor 操作时,14=] 变成向量。我尝试执行 typecast 将向量转换为无符号值,但不起作用。我试过强制演员表,但也不管用。函数下方:

function galois_value = galois_mul2( value )
    hex = uint8(hex2dec('1B')); 
    temp = typecast(value, 'int8');
    temp = bitshift(temp,-7); 
    temp = bitand(typecast(temp,'uint8'),hex); 
    galois_value =  bitxor(bitshift(value,1),uint16(temp)); 
end

此函数的正确输出应该是(此输出来自正在运行的 C 代码):

96
210
97
224
119
194
192
156
196
195
102
10
10
117
235
213
49
57
235
79
172
5
23
62
111
188
223
128
113
133
128
102
30
238
226
31

我用 MatLab 函数得到的输出:

96     96

210    210

353    378

224    224

375    364

194    194

192    192

156    156

196    196

451    472

102    102

 10     10

 10     10

373    366

491    496

469    462

305    298

313    290

491    496

335    340

172    172

261    286

279    268

 62     62

367    372

188    188

479    452

128    128

369    362

389    414

128    128

102    102

 30     30

238    238

226    226

287    260

显示调试功能的代码:

%Key
key = {'00','01','02','03','04','05','06','07','08','09','0a','0b','0c','0d','0e','0f'};
for n = 1 : 16
   keyU(n)=uint16(hex2dec(key(n)));
end
%State
state = {'00','11','22','33','44','55','66','77','88','99','aa','bb','cc','dd','ee','ff'};
for n = 1 : 16
   stateU(n)=uint16(hex2dec(state(n)));
end
%Sbox
sbox = {'63','7c','77','7b','f2','6b','6f','c5','30','01','67','2b','fe','d7','ab','76','ca','82','c9','7d','fa','59','47','f0','ad','d4','a2','af','9c','a4','72','c0','b7','fd','93','26','36','3f','f7','cc','34','a5','e5','f1','71','d8','31','15','04','c7','23','c3','18','96','05','9a','07','12','80','e2','eb','27','b2','75','09','83','2c','1a','1b','6e','5a','a0','52','3b','d6','b3','29','e3','2f','84','53','d1','00','ed','20','fc','b1','5b','6a','cb','be','39','4a','4c','58','cf','d0','ef','aa','fb','43','4d','33','85','45','f9','02','7f','50','3c','9f','a8','51','a3','40','8f','92','9d','38','f5','bc','b6','da','21','10','ff','f3','d2','cd','0c','13','ec','5f','97','44','17','c4','a7','7e','3d','64','5d','19','73','60','81','4f','dc','22','2a','90','88','46','ee','b8','14','de','5e','0b','db','e0','32','3a','0a','49','06','24','5c','c2','d3','ac','62','91','95','e4','79','e7','c8','37','6d','8d','d5','4e','a9','6c','56','f4','ea','65','7a','ae','08','ba','78','25','2e','1c','a6','b4','c6','e8','dd','74','1f','4b','bd','8b','8a','70','3e','b5','66','48','03','f6','0e','61','35','57','b9','86','c1','1d','9e','e1','f8','98','11','69','d9','8e','94','9b','1e','87','e9','ce','55','28','df','8c','a1','89','0d','bf','e6','42','68','41','99','2d','0f','b0','54','bb','16'}; 
for n = 1 : 256
   sboxU(n)=uint16(hex2dec(sbox(n)));
end
%Rcon
rcon = {'01','02','04','08','10','20','40','80','1b','36'};
for n = 1 : 10
   rconU(n)=uint16(hex2dec(rcon(n)));
end
%Main AES Data Loop
for round = 1 : 10
%Add key + sbox 
    for i = 1 : 16
        stateU(i)= sboxU(bitxor(stateU(i),keyU(i))+1);
    end
%Shift Rows
    buf1 = stateU(2);
    stateU(2) = stateU(6);
    stateU(6) = stateU(10);
    stateU(10) = stateU(14);
    stateU(14) = buf1;

    buf1 = stateU(3);
    buf2 = stateU(7);
    stateU(3) = stateU(11);
    stateU(7) = stateU(15);
    stateU(11) = buf1;
    stateU(15) = buf2;

    buf1 = stateU(16);
    stateU(16) = stateU(12);
    stateU(12) = stateU(8);
    stateU(8) = stateU(4);
    stateU(4) = buf1;
%Process mixcolumn for all rounds but the last one
    if round < 10
        for j = 0 : 3
%Compute the current index
            buf4 = (bitshift(j,2));
            %buf1
            aux1 = bitxor(stateU(buf4+1),stateU(buf4+2));
            aux2 = bitxor(stateU(buf4+3),stateU(buf4+4));
            buf1 = bitxor(aux1,aux2);
            %buf2
            buf2 = stateU(buf4+1);
            %buf3
            buf3 = bitxor(stateU(buf4+1),stateU(buf4+2));
           buf3 = galois_mul2(buf3);
            disp(buf3);
        end
    end

end

问题出在galois_mul2函数的第3行
temp = typecast(value, 'int8'); 由于值的类型为 uint16,类型转换的输出是两个元素。 例如typecast(uint16(5), 'int8') 的输出是 5 0 如果将 main 的第 3,8,13,18 行和 galois_mul2 函数的第 3,6 行中的所有类型更改为 uint8,问题将得到解决。