How to convert bitstream to packets and bitxor function
4 ビュー (過去 30 日間)
古いコメントを表示
I have to convert a bit stream file such as name `BL.264` source file . Now I want to parse the file into packets with packet size is 50 bytes. After that, I want to implement bit XOR between first packet and second packet. To do it, I will use `fread` and `bitxor` functions. However, I have some issues:
- If size of file is not divisible by packet sizes, we must add some padding at the end of final packet, *Right?* Let see my implementation, is it correct?
- The bitxor supports xor bitwise that have limit length. In my case, packet size is 50 bytes, it is impossible to bitxor two packet. How to resolve that problem.
Let see my code. If have any problem, let me know
function packet=bitstream2packet(file,psize)
%%file='BL.264';
%%psize=50;
fid=fopen(file,'r');
bytelist=fread(fid,'*uint8')';
bitexpanded = dec2bin(bytelist(:), 8) - '0';
bitstream = reshape( bitexpanded.', [],1);
%%Add padding
remain=rem(size(bitstream,1),psize);
bitstream(end+psize-remain)=0;
packet = reshape( bitstream.', [],50);
xorPacket=bitxor(packet(1,:),packet(2,:))
fclose(fid);
end
0 件のコメント
採用された回答
Guillaume
2014 年 11 月 14 日
You're storing your bitstream as a logical array. In that case, it's a logical operation that you want to perform, not a bitwise xor. Therefore use xor instead of bitxor.
Compare
n1 = 8; n2=32
n1logicalbit = dec2bin(n1, 8) - '0'; %gives [0 0 0 0 1 0 0 0]
n2logicalbit = dec2bin(n2, 8) - '0'; %gives [0 0 1 0 0 0 0 0]
logicalxor = xor(n1logicalbit, n2logicalbit); %gives [0 0 1 0 1 0 0 0]
binaryxor = bitxor(n1, n2); %gives 40
isequal(logicalxor, dec2bin(binaryxor, 8)-'0') %return true
Otherwise your code is fine. There's a few unnecessary transpositions, you could simply do:
bytelist = fread(fid, '*uint8'); %no transpose
bitexpanded = dec2bin(bytelist, 8) -'0'; %no colon which in your case just transposed
I would also move the fclose to just after you've done the fread. This way if your code stops further down because of an error or the user interrupting it, the file won't be left open.
7 件のコメント
Guillaume
2014 年 11 月 17 日
Now, I'm very confused. your original code split the file in packets of 50 bits, not bytes.
If you're operating on bytes, then you don't need to read the file in bits unit, just read it as a 50*Inf array of bytes:
byte50 = fread(fid, [50 Inf], '*uint8')'; %again it will automatically pad the last packet
Even if you're operating on bits afterward, you probably don't need to convert to binary. Certainly not for xoring packets. The bit* functions should be enough.
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Data Type Conversion についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!