簡體   English   中英

相當於Java

[英]Equivalent in Java

花了我幾個小時來通過谷歌搜索來解決這個問題,我認為需要幫助。 我有一個片段,導致它不像目標c中的等效工作,所以需要一些專家的幫助。

java中下面的目標c片段相當於什么?

unsigned char mByte[CC_SHA1_DIGEST_LENGTH];

uint64_t tBytes = 0xFFFFFFFF;

那么沒有絕對的等價物,如果所有語言都相同,為什么我們需要不止一個?

最接近的可能是:

final int CC_SHA1_DIGEST_LENGTH = 1024; //some length
char[] mByte = new char[CC_SHAR1_DIGEST_LENGTH];

//there is no unsigned keyword in java
//The long data type is a 64-bit two's complement integer
long tBytes = Long.MAX_VALUE;

long tBytes=0xFFFFFFFF; 也可以,但這是一個負數(因為它被視為一個整數,而不是長整數)。 如果你想要它很長,你需要在最后添加L0xFFFFFFFFL )。 小心! 有關原始數據類型的更多信息,請參見此處

unsigned char mByte [CC_SHA1_DIGEST_LENGTH]; 相當於java將

final int CC_SHA1_DIGEST_LENGTH = 1024;

byte mByte [CC_SHA1_DIGEST_LENGTH];

雖然mByte是無符號的,所以當你使用mByte數組時,你必須使用0xFF將字節值轉換為無符號。 例如,mByte [0] =(0x88&0xFF);

uint64_t tBytes = 0xFFFFFFFF; 相當於java將

long tBytes = 0xFFFFFFFF;

那么經驗法則是匹配類型長度的比特。
在C中,unsigned char是8位寬,因此Java等效字節byte
在C uint64_t是64位寬,所以Java等價物將是長的
因此,Java等價物將是:

//SHA1 lenght would be 20 bytes
public static final int CC_SHA1_DIGEST_LENGTH = 20;
byte mBytes[] = new byte[CC_SHA1_DIGEST_LENGTH];
long tBytes = 0xFFFFFFFF;

@ user3200809 mByte [0] =(0x88&0xFF); - 除非您的值大於8位,否則此操作毫無意義。
在二進制中查看相同的操作:

 1000 1000
&
 1111 1111
=
 1000 1000

分配給mByte [i]時,你必須輸入cast to byte,這樣所有多余的位都會被切斷。

當我們查看這些類型的內存表示時,有符號和無符號類型之間沒有區別。

我猜測作者的帖子是他使用SHA1算法,這是一堆二進制操作(xor,and,shift)。
因此對於二進制操作,類型是有符號或無符號的沒有區別:

byte b = (byte) 0x80; //-128 in signed decimal
b ^= (byte) 0x01;
System.out.printf("0x%x", b); // prints 0x81 which is -127 in signed decimal

但如果你正在進行分工,你可能會遇到問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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