簡體   English   中英

將十進制轉換為二進制,任何基數

[英]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位。

轉換字節intslongs是非常簡單的。 您需要進行搜索,但這很簡單。

但是,可以說您的有效載荷可以大致分為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM