Если у меня есть 2 byte[]
массивы, есть ли встроенная функция, чтобы сравнить их ala C's memcmp()
?эквивалент memcmp() в Java?
ответ
Есть Arrays.equals().
Я не знаю, действительно ли реализация JVM оптимизирует это, если соответствующая инструкция существует в аппаратном обеспечении, но я сомневаюсь.
Кроме того, если я правильно помню свой C, strcmp работает до нулевого терминатора (что делает его полезным для строк C), версия Arrays будет сравнивать весь массив, так как Java-программисты редко беспокоятся о нулевых концах массивов. Вы можете легко написать свою собственную функцию, хотя, если вам небезразличен нулевой ограничитель.
[Arrays.equals] [1]
[1]: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html#equals(byte[], байт [])
Метод java.util.Arrays.equals(byte[], byte[]) является вашим другом.
Ну, Arrays.equals()
Хорошо, но не может сравнивать поддиапазоны. В этом случае есть также путь через , а затем .subList()
, но не для примитивов, таких как byte[]
.
На самом деле нет прямого memcmp()
эквивалента. Вот discussion и как только я знаю, что он находится в том же состоянии уже (15 лет). Большая «нативная» реализация может быть достигнута моим вариантом с помощью метода java.nio.ByteBuffer
(wrap()
, а затем equals()
). Но это несколько большая сумма кода.
Для людей, которые полностью не понимают предмет: memcmp()
реализован в зависимости от платформы, который очень эффективен и ничто в Java в настоящее время не подходит к нему. Любые ручные циклы далеки от производительности по крайней мере из-за проверки диапазона индексов. Может быть, когда-нибудь люди, которые пришли из встроенного C/C++, будут удовлетворены на эту тему :-).
плюс 1 для обозначения поддиапазонов. В этом случае можно использовать 'Arrays.copyOfRange()' с 'Arrays.equals()', но, вероятно, неэффективно. –
Memcmp возвращает значение, меньшее, равное или большее нуля, если первые n байтов s1 найдены соответственно, чтобы быть меньше, соответствовать или быть больше, чем первые n байтов s2. Equals возвращает boolean. Это не такая же функция. Кроме того, memcmp сравнивает байты как символы без знака.
Я думаю, что это может работать:
public int memcmp(byte b1[], byte b2[], int sz){
for(int i = 0; i < sz; i++){
if(b1[i] != b2[i]){
if(b1[i] >= 0 && b2[i] >= 0)
return b1[i] - b2[i];
if(b1[i] < 0 && b2[i] >= 0)
return 1;
if(b2[i] < 0 && b1[i] >= 0)
return -1;
if(b1[i] < 0 && b2[i] < 0){
byte x1 = (byte) (256 + b1[i]);
byte x2 = (byte) (256 + b2[i]);
return x1 - x2;
}
}
}
return 0;
}
(редактировать) На самом деле, 2-дополнением часть не является необходимым:
public static int memcmp(byte b1[], byte b2[], int sz){
for(int i = 0; i < sz; i++){
if(b1[i] != b2[i]){
if((b1[i] >= 0 && b2[i] >= 0)||(b1[i] < 0 && b2[i] < 0))
return b1[i] - b2[i];
if(b1[i] < 0 && b2[i] >= 0)
return 1;
if(b2[i] < 0 && b1[i] >=0)
return -1;
}
}
return 0;
}
Не возврат 1 и возврат -1 обратный? –
- 1. Пользовательский шаблон memcmp vs C memcmp
- 2. intrinsic memcmp
- 3. Как сделать memcmp() в Swift?
- 4. создание функции memcmp в c
- 5. Ошибка сегментации на memcmp
- 6. Segfault при использовании memcmp
- 7. Использование strncmp и memcmp
- 8. Segfault при использовании memcmp()
- 9. Эквивалент fgets в Java
- 10. эквивалент Sprintf в Java
- 11. эквивалент DataTable в Java
- 12. Эквивалент в Java
- 13. Curl эквивалент в Java
- 14. Эквивалент openssl в Java
- 15. doesNotRecognizeSelector эквивалент в Java
- 16. эквивалент cURL в JAVA
- 17. isprint эквивалент в Java
- 18. эквивалент ungetc В java
- 19. preg_replace эквивалент в Java
- 20. str.find() эквивалент в java?
- 21. Эквивалент «в» для Java
- 22. Эквивалент внутреннего в java
- 23. AFOAuth2Client эквивалент в Java
- 24. Эквивалент #define в Java?
- 25. __LINE__ эквивалент в Java?
- 26. xml.etree.ElementTree эквивалент в Java
- 27. GetDriveType() эквивалент в Java
- 28. char ** эквивалент в Java
- 29. CFSwapInt32LittleToHost эквивалент в java
- 30. Java эквивалент # в Python
Мне интересно, для случая, когда кто-то Null прекратить их собственный массив в Java –
Я никогда не пробовал это, но я бы предположил, что, может быть, если вы вызвали собственный метод в C и использовали буфер ... – Uri
Откуда появился strcmp? Вопрос был о memcmp, и я тоже не вижу strcmp в истории изменений. – laalto