diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/ConvertToCharAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/ConvertToCharAction.java index f0810376b5..d6e3055beb 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/ConvertToCharAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/ConvertToCharAction.java @@ -20,7 +20,6 @@ import ghidra.program.model.data.ByteDataType; import ghidra.program.model.data.StringDataInstance; import ghidra.program.model.listing.Program; import ghidra.program.model.scalar.Scalar; -import utilities.util.ArrayUtilities; public class ConvertToCharAction extends AbstractConvertAction { public static final String ACTION_NAME = "Convert To Char"; @@ -49,10 +48,6 @@ public class ConvertToCharAction extends AbstractConvertAction { @Override protected String convertToString(Program program, Scalar scalar, boolean isData) { byte[] bytes = scalar.byteArrayValue(); - boolean isLE = !program.getMemory().isBigEndian(); - if (isLE) { - bytes = ArrayUtilities.reverse(bytes); - } return StringDataInstance.getCharRepresentation(ByteDataType.dataType, bytes, null); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractIntegerDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractIntegerDataType.java index da9c4a8f0d..c29863199a 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractIntegerDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractIntegerDataType.java @@ -21,6 +21,7 @@ import ghidra.docking.settings.*; import ghidra.program.model.mem.MemBuffer; import ghidra.program.model.scalar.Scalar; import ghidra.util.StringFormat; +import utilities.util.ArrayUtilities; /** * Base type for integer data types such as {@link CharDataType chars}, {@link IntegerDataType ints}, @@ -224,32 +225,29 @@ public abstract class AbstractIntegerDataType extends BuiltIn implements ArraySt return "??"; } + boolean isLE = !ENDIAN.isBigEndian(settings, buf); + if (isLE) { + bytes = ArrayUtilities.reverse(bytes); + } + if (getFormatSettingsDefinition().getFormat(settings) == FormatSettingsDefinition.CHAR) { return StringDataInstance.getCharRepresentation(this, bytes, settings); } - boolean isBigEndian = ENDIAN.isBigEndian(settings, buf); - - if (!isBigEndian) { - byte[] flipped = new byte[size]; - for (int i = 0; i < size; i++) { - flipped[i] = bytes[size - i - 1]; - } - bytes = flipped; - } - - return getRepresentation(new BigInteger(bytes), settings, 8 * length); } /** * Get integer representation of the big-endian value. + *
+ * Does not handle CHAR format, use {@link StringDataInstance#getCharRepresentation(DataType, byte[], Settings)}
+ *
* @param bigInt BigInteger value with the appropriate sign
* @param settings integer format settings (PADDING, FORMAT, etc.)
* @param bitLength number of value bits to be used from bigInt
* @return formatted integer string
*/
- public String getRepresentation(BigInteger bigInt, Settings settings, int bitLength) {
+ /*package*/ String getRepresentation(BigInteger bigInt, Settings settings, int bitLength) {
int format = getFormatSettingsDefinition().getFormat(settings);
boolean padded = PADDING.isPadded(settings);
diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BitFieldDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BitFieldDataType.java
index bc900798aa..4ca59ed2d6 100644
--- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BitFieldDataType.java
+++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BitFieldDataType.java
@@ -17,11 +17,12 @@ package ghidra.program.model.data;
import java.math.BigInteger;
-import ghidra.docking.settings.Settings;
-import ghidra.docking.settings.SettingsDefinition;
+import ghidra.docking.settings.*;
import ghidra.program.model.mem.MemBuffer;
import ghidra.program.model.scalar.Scalar;
+import ghidra.util.DataConverter;
import ghidra.util.exception.AssertException;
+import utilities.util.ArrayUtilities;
/**
* BitFieldDataType
provides a means of defining a minimally sized bit-field
@@ -406,7 +407,20 @@ public class BitFieldDataType extends AbstractDataType {
if (dt instanceof Enum) {
return ((Enum) dt).getRepresentation(big, settings, effectiveBitSize);
}
- return ((AbstractIntegerDataType) dt).getRepresentation(big, settings, effectiveBitSize);
+ AbstractIntegerDataType intDT = (AbstractIntegerDataType) dt;
+ if (intDT.getFormatSettingsDefinition().getFormat(
+ settings) == FormatSettingsDefinition.CHAR) {
+ int bytesLen = BitFieldDataType.getMinimumStorageSize(bitSize);
+ byte[] bytes = DataConverter.getInstance(getDataOrganization().isBigEndian()).getBytes(
+ big, bytesLen);
+ if (!EndianSettingsDefinition.ENDIAN.isBigEndian(settings, buf)) {
+ bytes = ArrayUtilities.reverse(bytes);
+ }
+
+ return StringDataInstance.getCharRepresentation(this, bytes, settings);
+ }
+
+ return intDT.getRepresentation(big, settings, effectiveBitSize);
}
@Override
diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StringDataInstance.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StringDataInstance.java
index b1a4853302..93e246eea6 100644
--- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StringDataInstance.java
+++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StringDataInstance.java
@@ -283,7 +283,7 @@ public class StringDataInstance {
if (dataType instanceof AbstractStringDataType) {
return ((AbstractStringDataType) dataType).getStringLayout();
}
- if (dataType instanceof AbstractIntegerDataType) {
+ if (dataType instanceof AbstractIntegerDataType || dataType instanceof BitFieldDataType) {
return StringLayoutEnum.FIXED_LEN;
}
return StringLayoutEnum.NULL_TERMINATED_BOUNDED;