[英]Converting decimal to binary, any radix
長期程序員,業余愛好者。
我們有一個80位幀(80 1's / 0-s)來編碼/解碼銥/網絡通信。 為了將所有參數轉換為80位(緯度,經度,通量等),位的對齊方式不是2、8、16等。它們對齊為3位,1、7、8等。A精通C的位旋轉器知道屏蔽/移位操作,但我不知道。 經過幾天的谷歌搜索,我得到了一個簡單的例子(BigInteger?String奇數字符串= Integer.toString(數字,odd_radix)?char [] Buf?)。 有沒有簡單易行的方法,還是我可以使用示例的良好鏈接?
在某種程度上,這實際上非常簡單。 主要問題是您有80位,並且沒有“自然”的方式將其表示為Java中的整體塊。
有BitSet類,但是它並沒有真正提供您想要的東西(即“我希望將3位7、8和9的值作為整數”或相反地“設置3位值從7位開始”) 。
如果您的表示足夠大,則遮罩和移動非常簡單。 如果您的位數少於32,則簡單的int
就足夠了。 不幸的是,您只有80位,而即使很長(64位)也不夠長。
但是,如果運氣好(沒有使用銥星有效負載的經驗,那么有效負載會在任何合理的邊界處中斷(即,有一組以32位屏障或64位屏障結尾的字段),那么您可以打破有效載荷向上分離成單獨的“塊”,然后對它們進行單獨處理和處理,然后進行掩蔽和移位就很容易了。
另一個問題是Java沒有未unsigned
數據類型,但是如果您不需要嘗試整體訪問數據,那么這個問題就不那么重要了。 最后,有符號或無符號32位就是32位。
轉換字節ints
和longs
是非常簡單的。 您需要進行搜索,但這很簡單。
但是,可以說您的有效載荷可以大致分為48位容器和32位容器。 這意味着沒有一個字段跨越48位標記。 這將適用於8位標記上的任何邊界。
基本上,您可以將48位6字節數組轉換為long型。
long l = convertFromBytes(sixByteArrayOfData);
這樣,移位和掩蓋就很容易了。 您只需用二進制表示代表字段的常量,然后將它們轉換為十六進制。
因此,假設您要15、16、17、18位。
用二進制表示:
00000000 00000000 00000000 00000111 10000000 00000000
但這僅僅是48位。 所以,把它墊出來
00000000 00000000 00000000 00000000 00000000 00000111 10000000 00000000
將其轉換為十六進制:
00 00 00 00 00 07 80 00
使它成為一個十六進制常量:
long mask15to18 = 0x0000000000078000
現在您可以屏蔽它:
int fieldValue = l & mask15to18;
然后,您轉移它。 由於我們正在使用第15位,因此將其移位15次。
fieldValue = fieldValue >> 15;
您建立了一個蒙版和輪班集合以拉出您的領域。
要將它們添加回去,您只需再次移動蒙版,然后將其添加到最終值即可。
newValue = newValue + ((fieldValue << 15) & mask15to18)
您需要屏蔽掉所有符號擴展名,因為您沒有使用無符號值。
您需要為每個字段執行此操作,直到您擁有將有效負載從10字節數組轉換為通常可以使用的Java對象的解碼和編碼方法為止。
它適用於int,byte,longs。 只需在您的有效負載中找到字段不跨越8位邊界的點。 這就是讓它變得容易的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.