作者abc95007 (别理我)
看板C_Sharp
标题[问题] 自订数据长度
时间Tue Mar 3 15:03:22 2020
想请问
C# 要如何达到自订数据长度
主要是用来做bit位移
内建最多就long 64bit
需要资料长度120bit
感觉struct或是用 array 兜出来
但抓不到想法要如何兜
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.217.109.68 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1583219004.A.FC5.html
1F:→ petercoin: BitArray不知道符不符合你的使用情境? 03/03 15:19
我看看是否 bitArray 否可行
其实主要是要将 RGB 24bit 转成 RGB 30bit
例如 RGB 0xFF 0xFF 0xFF (11111111 11111111 11111111)
转成 RGB 0011111111 0011111111 0011111111 再排成 byte (缺失高位元先补零)
RGB 00111111 11001111 11110011 .....
两者最小公倍数120bit, 所以才想说能否有120bit, 又支援 << , & , | 运算等等
想到最笨的做法就是 byte array 全部转成 120 长度字串, 再取其中8个字串转成byte
只是想说有没有跟优雅的写法
※ 编辑: abc95007 (180.217.109.68 台湾), 03/03/2020 16:09:15
3F:推 s4300026: unsafe (误) 03/03 20:45
感谢 BigInteger 可行!
※ 编辑: abc95007 (180.217.109.68 台湾), 03/04/2020 11:24:10
4F:推 Litfal: 你这需求其实蛮稀有的,图像处理通常直升16bits,32bits甚 03/04 14:15
5F:→ Litfal: 至double,处理完後再依输出10bits做round/truncate,甚至 03/04 14:15
6F:→ Litfal: dithering 03/04 14:15
因为最後要是产生 bin 档丢入IC, IC 再去组成10bit
24bit 与 30bit 最小公倍数又可整除 byte 就是120bit大小
※ 编辑: abc95007 (122.116.139.44 台湾), 03/05/2020 00:38:52
7F:→ ssccg: 不懂为什麽这样要120bit,只是24转32不是吗? 03/05 10:06
8F:→ ssccg: 30,感觉32bits够用 03/05 10:07
9F:推 Litfal: 他是要做solid而不是常用的每一点3*10bit int32 03/05 14:03
10F:→ Litfal: int32里面多的2bits还要给下一点用 03/05 14:04
11F:→ Litfal: 纯资料处理我是会用bytes阵列和unsafe啦,用bigint还得遵 03/05 14:09
12F:→ Litfal: 守它的规则(little endian,正负号等) 03/05 14:09
13F:→ ssccg: 我的意思就是其实也可自己取byte[n] ~ byte[n+3]丢进int32 03/06 14:20
14F:→ ssccg: 转完後再把int32拆开丢进byte[m](x) ~ byte[m+3或4](y) 03/06 14:21
15F:→ ssccg: 只要记好offset就好,不一定要到120bit为单位做吧 03/06 14:22
16F:推 Litfal: 是阿,如果做成资料流,以色素为单位,一个int16做buffer 03/06 14:57
17F:→ Litfal: 就可以处理了。但也能理解原po想用4个像素一起处理,输出4 03/06 14:57
18F:→ Litfal: 个30bits像素为一组,因为刚好是15bytes。 03/06 14:57
是没想到用 int 当buffer, 当时只是想到有些byte可能会被切一半,或是被乱切
觉得麻烦, 只想说一次可以处理一组完整的单位, 有问题也比较好 debug XD
※ 编辑: abc95007 (122.116.139.44 台湾), 03/07/2020 00:08:18
19F:推 neo5277: 好像很有趣 03/07 02:30
20F:推 nicetw20xx: 我会在C用bit field,x86电脑pg最小单位好像都byte 05/10 00:35