matlab大小端模式轉化十進位制

2021-10-17 14:06:28 字數 4023 閱讀 2362

小端模式:記憶體的低位址存資料的低位,記憶體的高位址存資料的高位。低低高高。 2,大端模式:記憶體的低位存資料的高位,記憶體的高位址存資料的低位。 低高高低

使用matlab實現了小端模式的資料處理,並且將處理後的資料寫入到excel**中,大端處理方式類似。

處理前 處理後

讀取裝置的值,按小段模式儲存,需要分析其資料進行濾波處理

讀取通道1 通道2 通道3的資料

將兩個位元組的資料 小端模式轉化為十進位制

% 1,小端模式:記憶體的低位址存資料的低位,記憶體的高位址存資料的高位。低低高高。 2,大端模式:記憶體的低位存資料的高位,記憶體的高位址存資料的低位。 低高高低

% 最高位為符號位,正數為0 負數為1

% 小端模式:先傳過來小的,再傳大的, e5 fd,低位元組為e5 高位元組為fd

% 原始資料,資料格式是: 0xaa + 通道1(2byte 小端)+ 通道2(2byte 小端)+ 通道3(2byte 小端)+ checksum(2byte)

% 處理後將資料寫入到.xlsx**中

function main()

global runall

runall = 1; % 0 只讀取其中乙個檔案 1:讀取資料夾下所有的檔案

[filename, pathname] = uigetfile('*.*', '選擇資料檔案','multiselect', 'on'); %選擇檔案

if isequal(filename,0) ; return;end

if runall == 1

list = dir([pathname,'*.txt']);

list_len = length(list);

for i = 1:list_len

filename = list(i).name;

readdata(pathname, filename);

endelse

readdata(pathname, filename);

endend

%讀取通道1 通道2 通道3的資料

function readdata(pathname, filename)

filename = fullfile(pathname, filename);

data_struct = importdata(filename);

if isequal(class(data_struct), 'struct')

data = data_struct.textdata;

else

data = data_struct;

endk = 1; % k為處理數的index

for i =1:length(data)

j=1;

while j < length(data) - 1

%aa e5 fd e3 ff 0a 00 d2 fd

if isequal(data(j:j+1), 'aa') % 處理以aa開頭的後面的數字

if 1

second_data = hex2dec(data(j+6:j+7)); % 將高位位元組的兩位數轉為10進製

% 處理第乙個通道的數字,先將低位元組和高位元組拼接

low_bit = data(j+3:j+4);

high_bit = data(j+6:j+7);

raw_data(k, 1) = hex2dec(second_data,low_bit, high_bit);

% 處理第二個通道的數字,先將低位元組和高位元組拼接

symbol=hex2dec(data(j+12:j+13));

low_bit = data(j+9:j+10);

high_bit = data(j+12:j+13);

raw_data(k, 2) = hex2dec(symbol,low_bit, high_bit);

% 處理第三個通道的數字,先將低位元組和高位元組拼接

symbol=hex2dec(data(j+18:j+19));

low_bit = data(j+15:j+16);

high_bit = data(j+18:j+19);

raw_data(k, 3) = hex2dec(symbol,low_bit, high_bit);

else % 分別處理

second_data = hex2dec(data(j+6:j+7)); % 將高位位元組的兩位數轉為10進製

% 處理第乙個通道的數字,先將低位元組和高位元組拼接

low_bit = data(j+3:j+4);

high_bit = data(j+6:j+7);

data_high_low = strcat(high_bit, low_bit);

if(second_data > 127) % 最高位為1, 負數

raw_data(k, 1) = -(hex2dec('ffff') - hex2dec(data_high_low));

else % 正數不需要處理

raw_data(k, 1) = hex2dec(data_high_low);

end% 處理第二個通道的數字,先將低位元組和高位元組拼接

symbol=hex2dec(data(j+12:j+13));

low_bit = data(j+9:j+10);

high_bit = data(j+12:j+13);

data_high_low = strcat(high_bit, low_bit);

if(symbol > 127) % 最高位為1, 負數

raw_data(k, 2) = -(hex2dec('ffff') - hex2dec(data_high_low));

else % 正數不需要處理

raw_data(k, 2) = hex2dec(data_high_low);

end% 處理第三個通道的數字,先將低位元組和高位元組拼接

symbol=hex2dec(data(j+18:j+19));

low_bit = data(j+15:j+16);

high_bit = data(j+18:j+19);

data_high_low = strcat(high_bit, low_bit);

if(symbol > 127) % 最高位為1, 負數

raw_data(k, 3) = -(hex2dec('ffff') - hex2dec(data_high_low));

else % 正數不需要處理

raw_data(k, 3) = hex2dec(data_high_low);

endend

k = k+1;

j = j+ 25;

else

j=j+1;

endend

end% 將處理後的數字寫入到對應的檔案中

name = strsplit(filename,'.');

wfile = strcat(name(1),'.xlsx');

xlswrite(wfile,raw_data);

end%將兩個位元組的資料 小端模式轉化為十進位制

%symbol 符號位:提取高位元組,判斷最高位是0-正數,1-負數

%low_bit 低位元組的資料

%high bit 高位元組的資料

%eg:fd e5--> -538 data 返回轉為10進製的資料

function data = hex2dec(symbol,low_bit, high_bit)

data_high_low = strcat(high_bit, low_bit);

if(symbol > 127) % 最高位為1, 負數

data = -(hex2dec('ffff') - hex2dec(data_high_low));

else % 正數不需要處理

data = hex2dec(data_high_low);

endend

大小端模式

偶 注意 大小端的高低位資料是按位址來計算的。如0x1001,10是高位位元組,01是低位位元組。char s abcd a是高位位元組 所謂的大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順...

大小端模式

所謂的大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址中...

大小端模式

端模式 endian 的這個詞出自jonathanswift書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為bigendian,從尖頭開始將雞蛋敲開的人被歸為littileendian。小人國的內戰就源於吃雞蛋時是究竟從大頭 big endian ...