필터 지우기
필터 지우기

Creating a hex array with 4 digit blocks from an array of integers

조회 수: 23 (최근 30일)
Art
Art 2017년 1월 21일
댓글: Walter Roberson 2017년 1월 22일
I am using R2013 and need to convert a large decimal array into hex stings.
The decimal numbers can be any positive integer, and I need to convert each number, then display each as a minimum two byte string with preceding zeros (with more bytes shown as the number increases).
e.g. decimal "1" should show up as '0x0001',
decimal "69876" should show up as '0x0001 0x10F4'
I created a rather cumbersome loop that does this perfectly, but with large arrays it takes too long.
I can get part way to a non-loop implementation with this code:
DecArray = [1 2 4 69876];
cellstr(dec2hex(reshape(DecArray,[],1), 4));
ans =
'00001'
'00002'
'00004'
'110F4'
But as you see the outputs
1) always have the same number of digits, and
2) aren't broken into 2 Byte blocks
Is there any way to go from these results to the ones I described earlier without another loop?
  댓글 수: 5
Art
Art 2017년 1월 22일
편집: Art 2017년 1월 22일
The data can be in 16bit OR 32bit words, so it's just a matter of displaying in the easiest way to read for the data being analyzed. If the dec number is greater than 65535 then it's a 32 bit and should display as such.
Walter Roberson
Walter Roberson 2017년 1월 22일
I dunno. It just seems unlikely to me that the data could vary between 16 and 32 bits on the same plot.

댓글을 달려면 로그인하십시오.

채택된 답변

Stephen23
Stephen23 2017년 1월 21일
편집: Stephen23 2017년 1월 21일
V = [1,2,4,69876];
L = log(16);
for k = 1:numel(V)
N = 4*(1+fix(log(V(k))/L/4));
S = sprintf('%0*X',N,V(k));
Z = sprintf('0x%c%c%c%c ',S)
end
Prints this in the command window:
Z =
0x0001
Z =
0x0002
Z =
0x0004
Z =
0x0001 0x10F4
Note: does not work for zero: add N = max(4,N)
  댓글 수: 1
Art
Art 2017년 1월 21일
Stephen,
This works great and is much simpler than my old loop. If I can't get Guillaume's answer to work then I will accept this. Thanks!

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Guillaume
Guillaume 2017년 1월 21일
DecArray = [1 2 4 69876]';
h = arrayfun(@dec2hex, DecArray, 'UniformOutput', false);
cellfun(@(s) strcat('0x', cellstr(reshape([repmat('0', 1, mod(-numel(c), 4)), c], 4, [])')), d, 'UniformOutput', false)
  댓글 수: 3
Walter Roberson
Walter Roberson 2017년 1월 22일
편집: Walter Roberson 2017년 1월 22일
d should be h
Art
Art 2017년 1월 22일
I had to substitute h for both d and c, but the output format wasn't quite what I needed.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by